我在这里读到:
.NET async, can a single thread time-slice between tasks?
除非你明确使用async / await,否则任务不会在后端线程池中的同一个线程上“时间分片”。这有保证吗?或者仅仅是当前TPL实施的副作用?
如果不能保证,使用lock()
会导致问题:
考虑两个在发布之前访问完整SerialPort事务locks
的方法(发送消息并接收或超时)的两个任务。如果在同一个线程上发生时间分片并且SerialPort访问速度足够慢,则lock
将无法完成其工作(让两个调用都通过,因为它们在技术上位于同一个线程上)。
答案 0 :(得分:0)
是的,只要您不执行任何使(代码的某些部分)代码在另一个线程(await
,Task.Run()
,Task.ContinueWith()
,{{1}上执行的操作},...),然后使用Thread
或其他基于线程的同步机制是安全的。
一个可能的例外情况是,如果您有自定义lock
(例如TaskScheduler
)并且您以某种方式使该调度程序尝试执行更多TaskScheduler.FromCurrentSynchronizationContext()
s而Task
仍在执行(例如Task
之类的东西)。在这种情况下,您的Application.DoEvents()
仍然不会移动到另一个线程,但可能会暂停,而另一个Task
在同一个线程上执行。但这种情况应该非常罕见。