【发布时间】:2019-10-22 18:40:04
【问题描述】:
我正在编写一个应用程序,其中我使用了几种访问某些共享资源的方法,因此通过lock(thisLock){ [...] ] 实现了一些安全性
一切都很好,直到我不得不在异步任务中使用资源。 这是代码:
private object thisLock = new object();
[...]
private void UpdateStuff()
{
lock(thisLock)
{
Task.Run(()=>{[code where I use shared resources]});
}
}
它似乎工作正常,但我想知道这是否是正确的做法,或者我是否应该将 lock() 部分放在 Run() 中,如下所示:
private void UpdateStuff()
{
Task.Run( () => {
lock(thisLock)
{
[code where I use shared resources]
}
});
}
我试图获取一些信息,但我发现的所有内容都提到了使用关键字 async 时的情况,而事实似乎并非如此。
所以,我的问题是:哪一种是最好/正确的方式来使用带有 Task.Run() 的 lock()?为什么?
谢谢!
编辑:为了澄清,我的疑问是锁定何时以及多少有效,所以基本上我问的是在第一种情况下是否有可能锁定仅对 Run() 调用有效,因为调用本身的内容可能存在于另一个线程中,而在第二种情况下,锁将与内容相关联,因此是有效的。
【问题讨论】:
-
可以避免锁定吗?例如。
Task可能会返回一个结果,而不是具有可变数据,而该结果可以继续使用,那么您不需要锁定可变数据。 -
不是,因为我想保留任务代码中使用的资源,而不是任务本身的输出。