title: How to protect resources that may be used in a multi-threaded or async environment?
body: <p>I am working on a C# API that is used by a variety of consumers. This API provides access to a shared resource (in my case hardware that does serial communication) , that will often have a few different actors trying to use it concurrently.</p>
  
  <p>The issue I have is that some of my consumers will want to use this in a multi-threaded environment - each actor works independently and try to use the resource. A simple lock works fine here. But some of my consumers would prefer to use async-await and time-slice the resource. (As I understand it) this requires an asynchronous lock to yield the timeslice back to other tasks; blocking at a lock would halt that whole thread.</p>
  
  <p>And I imagine that having serial locks is unperformant at best, and a potential race condition or deadlock at worst.</p>
  
  <p>So how can I protect this shared resource in a common codebase for both potential concurrency usages?</p>