在任务中使用lock()是否安全?

时间:2016-04-18 19:05:35

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

我在这里读到:

.NET async, can a single thread time-slice between tasks?

除非你明确使用async / await,否则任务不会在后端线程池中的同一个线程上“时间分片”。这有保证吗?或者仅仅是当前TPL实施的副作用?

如果不能保证,使用lock()会导致问题:

考虑两个在发布之前访问完整SerialPort事务locks的方法(发送消息并接收或超时)的两个任务。如果在同一个线程上发生时间分片并且SerialPort访问速度足够慢,则lock将无法完成其工作(让两个调用都通过,因为它们在技术上位于同一个线程上)。

1 个答案:

答案 0 :(得分:0)

是的,只要您不执行任何使(代码的某些部分)代码在另一个线程(awaitTask.Run()Task.ContinueWith(),{{1}上执行的操作},...),然后使用Thread或其他基于线程的同步机制是安全的。

一个可能的例外情况是,如果您有自定义lock(例如TaskScheduler)并且您以某种方式使该调度程序尝试执行更多TaskScheduler.FromCurrentSynchronizationContext() s而Task仍在执行(例如Task之类的东西)。在这种情况下,您的Application.DoEvents()仍然不会移动到另一个线程,但可能会暂停,而另一个Task在同一个线程上执行。但这种情况应该非常罕见。