【问题标题】:How to synchronize access of shared data between tasks?任务之间如何同步访问共享数据?
【发布时间】:2017-07-27 14:52:45
【问题描述】:

我正在使用 .net 核心和任务进行一些并行工作,基本上就像两个生产者和一个消费者,两个任务将写入数据,消费者将读取数据,在传统的 .net 代码中,这些是由线程完成的,我可以使用SemaphoreMutexEventHandle 用于线程之间的同步,但是对于基于新任务的代码,我读到我不能再使用这些,因为不能保证异步函数将恢复await 之后是同一个线程,那么我应该如何在不同的任务之间同步呢?

【问题讨论】:

标签: c# multithreading task-parallel-library .net-core


【解决方案1】:

我应该如何在不同任务之间同步?

由于您有一个生产者/消费者系统,您可以使用BufferBlock<T>,它充当异步兼容的生产者/消费者队列。

在更一般意义上的协调原语替换,请参阅my AsyncEx.Coordination library。或者你可以build your own。 .NET 内置的唯一一个是 SemaphoreSlim

【讨论】:

  • 好的,谢谢,我试试AsyncEx,原来的同步原语都在System.Threading中,而System.Threading.Tasks中没有添加类似的东西,是不是说明这种情况在国内比较少见轻敲?或者当需要同步时,应该使用旧线程而不是任务?
  • 您最终需要减少与 TAP 同步的频率。 IMO 这部分是由于异步代码自然是功能性的,部分是由于它通常应用于的问题类型。在许多常见的场景中,过去使用线程完成的事情现在可以不用它来完成。
猜你喜欢
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 2018-02-14
  • 2017-12-02
相关资源
最近更新 更多