首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件变量的TPL等价物是什么?

条件变量的TPL等价物是什么?
EN

Stack Overflow用户
提问于 2013-05-21 03:03:58
回答 1查看 1.5K关注 0票数 5

我正在学习任务并行库(结合C# 5.0 async/await),我想这样做:

代码语言:javascript
复制
public class Foo
{
    public void UnblockDoSomething()
    {
        DoWork();
        // notify DoSomethingAsync
    }

    public async Task DoSomethingAsync()
    {
        DoSomeWork();
        await ... // Wait until UnblockDoSomething is called
        DoMoreWork();
    }
}

在传统的线程模型中,我可以使用条件变量来实现这一点。这个问题的第三方物流解决方案是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-21 03:10:00

如果您只收到一次性通知,则可以使用TaskCompletionSource

代码语言:javascript
复制
public class Foo
{
  private TaskCompletionSource<object> _signal = new TaskCompletionSource<object>();

  public void UnblockDoSomething()
  {
    DoWork();
    _signal.SetResult(null);
    _signal = new TaskCompletionSource<object>();
  }

  public async Task DoSomethingAsync()
  {
    var continueSignal = _signal.Task;
    DoSomeWork();
    await continueSignal;
    DoMoreWork();
  }
}

另一种选择是使用信号量(SemaphoreSlim),如果之前已经发出信号,它将“记住”:

代码语言:javascript
复制
public class Foo
{
  private readonly SemaphoreSlim _mutex = new SemaphoreSlim(0);

  public void UnblockDoSomething()
  {
    DoWork();
    _mutex.Release();
  }

  public async Task DoSomethingAsync()
  {
    DoSomeWork();
    await _mutex.WaitAsync();
    DoMoreWork();
  }
}

如果确实需要条件变量,可以使用my AsyncEx library中的AsyncConditionVariable

代码语言:javascript
复制
public class Foo
{
  private readonly AsyncLock _mutex = new AsyncLock();
  private readonly AsyncConditionVariable _cv = new AsyncConditionVariable(_mutex);

  public void UnblockDoSomething()
  {
    using (await _mutex.LockAsync())
    {
      DoWork();
      _cv.Notify();
    }
  }

  public async Task DoSomethingAsync()
  {
    using (await _mutex.LockAsync())
    {
      DoSomeWork();
      await _cv.WaitAsync();
      DoMoreWork();
    }
  }
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16656538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档