C# 在任务中使用lock()安全吗?
我在这里读到: 除非显式使用async/await,否则任务不会在后端线程池中的同一线程上“时间片”。这有保证吗?还是仅仅是目前实施第三方物流的副作用 如果不保证,将导致使用C# 在任务中使用lock()安全吗?,c#,.net,multithreading,task-parallel-library,C#,.net,Multithreading,Task Parallel Library,我在这里读到: 除非显式使用async/await,否则任务不会在后端线程池中的同一线程上“时间片”。这有保证吗?还是仅仅是目前实施第三方物流的副作用 如果不保证,将导致使用lock()时出现问题: 考虑两个任务,它们访问一个方法,该方法在释放之前对完整的SerialPort事务(发送消息并接收,或超时)进行锁定。如果时间切片发生在同一个线程上,并且SerialPort访问速度足够慢,锁将无法完成它的工作(让两个调用通过,因为它们在技术上在同一个线程上)。是的,只要您不做任何使代码(部分)在另
lock()
时出现问题:
考虑两个任务,它们访问一个方法,该方法在释放之前对完整的SerialPort事务(发送消息并接收,或超时)进行
锁定。如果时间切片发生在同一个线程上,并且SerialPort访问速度足够慢,锁将无法完成它的工作(让两个调用通过,因为它们在技术上在同一个线程上)。是的,只要您不做任何使代码(部分)在另一个线程上执行的事情(wait
,Task.Run()
,Task.ContinueWith()
,Thread
,…),然后使用lock
或其他基于线程的同步机制是安全的
一个可能的例外是,如果您有一个自定义的任务调度器
(例如任务调度器.FromCurrentSynchronizationContext()
),并且您以某种方式使该调度器在您的任务
仍在执行时尝试执行更多的任务
(例如类似Application.DoEvents()
)。在这种情况下,您的任务
仍然不会移动到另一个线程,但是当另一个任务
在同一个线程上执行时,它可能会暂停。但是这种情况应该非常罕见。因为您通常不会在外部调用周围锁定
,所以无论什么行为对于真正的代码都不应该有问题……是的,它的guaranteed,因为任务计划程序(甚至自定义)将等待给定的任务执行屈服或返回。如果任务不屈服于调度程序,您无法在同一线程上同时运行两个代码体。请注意,此问题是关于原始TPL代码的,因为它不适用于async
/wait
code-您不能在wait周围使用锁定代码>当您尝试执行此操作时,出现错误“无法在锁定语句体中使用'wait'运算符”。