【问题标题】:Non-blocking synchronization using System.Threading.Task使用 System.Threading.Task 的非阻塞同步
【发布时间】:2013-07-04 17:04:41
【问题描述】:

有没有办法从非阻塞线程同步的优点中受益,例如here 中描述的,但在当前.Net 框架版本中使用System.Threading.Task 对象时?

我正在寻找的本质上是更改此代码

new Task(() =>
{
    lock (_lock)
    {
        ...            
    }
});

进入不会阻塞Task 在执行受锁保护的操作时将使用的线程池线程的东西。

【问题讨论】:

  • 如果关键部分是短暂的并且可以避免死锁风险,则可以在任务内阻塞。
  • 另外,不要显式使用 Task 构造函数。请改用Task.Factory.StartNew
  • 也就是说,如果你真的要实现非阻塞实现,那么可以将你的算法分解为一系列任务和延续。
  • 我觉得这篇文章把你弄糊涂了:Wait() 肯定是 blocking 同步。
  • @Douglas:如果Task用于并行计算,那么StartNew就可以了;但如果Task 用于await,则Task.Run 更好。

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


【解决方案1】:

如果您想使用 .Net 4.0 TPL 执行此操作,可以使用自定义 TaskScheduler,例如 LimitedConcurrencyLevelTaskScheduler from ParallelExtensionsExtras

如果您可以使用 C# 5.0,您可以将 awaitSemaphoreSlim.WaitAsync()AsyncLock from Nito AsyncEx 一起使用。

【讨论】:

  • .NET 4.5 引入了ConcurrentExclusiveSchedulerPair,其中包括有限的并发性。
  • 很好,我想我喜欢AsyncLock 的想法,我会试着摆弄它,看看我能多好地完成我需要的东西。我正在使用的环境是 C# 5.0、.Net Framework 4.5、可移植类库项目。
猜你喜欢
  • 2018-04-06
  • 2023-03-14
  • 2013-07-20
  • 1970-01-01
  • 2011-10-21
  • 2013-05-07
  • 1970-01-01
  • 2016-12-14
相关资源
最近更新 更多