首页 > 解决方案 > 在异步库方法中处理共享成员变量的推荐做法是什么?

问题描述

在阅读了几篇关于 async await 的文章后,我现在明白了以下内容:

假设您正在创建一个库,该库在非静态类上具有异步 API 方法,并且该类具有一些跨其 API 方法共享的成员变量。您如何编写这些方法以确保以线程安全的方式访问成员变量?

标签: c#multithreadingasynchronousasync-awaitthread-safety

解决方案


根据您的需要,您可以async使用其他BCL 同步原语控制方法中的并发性

其中最简单的可能是SemaphoreSlim

Semaphore 和 SemaphoreSlim 类

和类限制可以System.Threading.Semaphore同时System.Threading.SemaphoreSlim 访问共享资源或资源池的线程数。请求资源的其他线程等待直到任何线程释放信号量。因为信号量没有线程亲和性,所以一个线程可以获取该信号量,另一个线程可以释放它。SemaphoreSlim 是 Semaphore 的轻量级替代方案,只能用于单个进程边界内的同步。

例子

private SemaphoreSlim _sync = new SemaphoreSlim(1,1);

...

public async Task SomeMethodThatAccessSharedResources()
{
   await _sync.WaitAsync();
   try
   {
      // example of async call
      await Task.Delay(1000);
   }
   finally
   {

      _sync.Release();
   }
}

推荐阅读