Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在任务中使用lock()安全吗?_C#_.net_Multithreading_Task Parallel Library - Fatal编程技术网

C# 在任务中使用lock()安全吗?

C# 在任务中使用lock()安全吗?,c#,.net,multithreading,task-parallel-library,C#,.net,Multithreading,Task Parallel Library,我在这里读到: 除非显式使用async/await,否则任务不会在后端线程池中的同一线程上“时间片”。这有保证吗?还是仅仅是目前实施第三方物流的副作用 如果不保证,将导致使用lock()时出现问题: 考虑两个任务,它们访问一个方法,该方法在释放之前对完整的SerialPort事务(发送消息并接收,或超时)进行锁定。如果时间切片发生在同一个线程上,并且SerialPort访问速度足够慢,锁将无法完成它的工作(让两个调用通过,因为它们在技术上在同一个线程上)。是的,只要您不做任何使代码(部分)在另

我在这里读到:

除非显式使用async/await,否则任务不会在后端线程池中的同一线程上“时间片”。这有保证吗?还是仅仅是目前实施第三方物流的副作用

如果不保证,将导致使用
lock()
时出现问题:


考虑两个任务,它们访问一个方法,该方法在释放之前对完整的SerialPort事务(发送消息并接收,或超时)进行
锁定。如果时间切片发生在同一个线程上,并且SerialPort访问速度足够慢,
锁将无法完成它的工作(让两个调用通过,因为它们在技术上在同一个线程上)。

是的,只要您不做任何使代码(部分)在另一个线程上执行的事情(
wait
Task.Run()
Task.ContinueWith()
Thread
,…),然后使用
lock
或其他基于线程的同步机制是安全的


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

因为您通常不会在外部调用周围锁定
,所以无论什么行为对于真正的代码都不应该有问题……是的,它的guaranteed,因为任务计划程序(甚至自定义)将等待给定的任务执行屈服或返回。如果任务不屈服于调度程序,您无法在同一线程上同时运行两个代码体。请注意,此问题是关于原始TPL代码的,因为它不适用于
async
/
wait
code-您不能在
wait周围使用
锁定
当您尝试执行此操作时,出现错误“无法在锁定语句体中使用'wait'运算符”。