我正在编写一个应用程序,其中使用多种方法来访问某些共享资源,因此通过以下方式实现了一些安全性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
已使用,但情况似乎并非如此。
所以,我的问题是:哪一种是将 lock() 与 Task.Run() 一起使用的最佳/正确方法?为什么?
谢谢你!
编辑:为了澄清,我的疑问是锁何时以及多少有效,所以基本上我问在第一种情况下是否有可能锁仅对Run()
调用,因为调用本身的内容可以存在于另一个线程中,而在第二种情况下,锁将与内容相关联,因此是有效的。
你的第一种方法是完全错误的。Task.Run
可以在同一线程上同步执行工作或将其排队到线程池中。你不知道会发生什么。
您不会等待任务完成,因此如果它排队到线程池中,您的函数将释放锁并返回,可能在工作开始之前。
一般来说,最佳实践是仅在需要的时间内获取锁,并且永远不要在等待另一个线程时保持锁定,因为如果不非常小心,很容易导致死锁。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)