如何正确锁定 Task.Run() 块
How to properly lock a Task.Run() block
我正在编写一个应用程序,我在其中使用了几种访问某些共享资源的方法,因此通过 lock(thisLock){ [...] ]
实现了一些安全性
一切都很好,直到我不得不在异步任务中使用资源。
这是代码:
private object thisLock = new object();
[...]
private void UpdateStuff()
{
lock(thisLock)
{
Task.Run(()=>{[code where I use shared resources]});
}
}
它似乎工作正常,但我想知道这是否是正确的方法,或者我是否应该将 lock()
部分放在 运行() 中,如下所示:
private void UpdateStuff()
{
Task.Run( () => {
lock(thisLock)
{
[code where I use shared resources]
}
});
}
我试图获取一些信息,但我发现的所有内容都提到了使用关键字 async
时的情况,但似乎并非如此。
所以,我的问题是:best/correct 将 lock() 与 Task.Run() 结合使用的方法是哪种?为什么?
谢谢!
编辑:为了澄清,我怀疑锁何时有效以及有效多少,所以基本上我问的是在第一种情况下是否有可能锁仅对 Run()
调用,因为调用本身的内容可能存在于另一个线程中,而在第二种情况下,锁将与内容相关联,因此有效。
这两者之间没有最佳方法,您只会获得 2 个不同的结果:
第一种情况,锁打开后才能开始任务
在第二种情况下,您将启动一个任务,该任务在锁打开之前不会执行任何操作。
在我看来,直到你需要它才打开一个任务,是一个更好的方法,但这只是个人意见。开锁后,分配无用资源
你的第一种方法是完全错误的。 Task.Run
可以在同一线程上同步执行工作 或将其排队到线程池。 你不知道会发生什么。
您不是在等待任务完成,因此如果它排队到线程池,您的函数将释放锁并 return,甚至可能在工作开始之前。
一般来说,最佳做法是只在需要的时候获取锁,并且永远不要在等待另一个线程时持有锁,因为如果你不是非常的话,很容易导致死锁小心。
我正在编写一个应用程序,我在其中使用了几种访问某些共享资源的方法,因此通过 lock(thisLock){ [...] ]
一切都很好,直到我不得不在异步任务中使用资源。 这是代码:
private object thisLock = new object();
[...]
private void UpdateStuff()
{
lock(thisLock)
{
Task.Run(()=>{[code where I use shared resources]});
}
}
它似乎工作正常,但我想知道这是否是正确的方法,或者我是否应该将 lock()
部分放在 运行() 中,如下所示:
private void UpdateStuff()
{
Task.Run( () => {
lock(thisLock)
{
[code where I use shared resources]
}
});
}
我试图获取一些信息,但我发现的所有内容都提到了使用关键字 async
时的情况,但似乎并非如此。
所以,我的问题是:best/correct 将 lock() 与 Task.Run() 结合使用的方法是哪种?为什么?
谢谢!
编辑:为了澄清,我怀疑锁何时有效以及有效多少,所以基本上我问的是在第一种情况下是否有可能锁仅对 Run()
调用,因为调用本身的内容可能存在于另一个线程中,而在第二种情况下,锁将与内容相关联,因此有效。
这两者之间没有最佳方法,您只会获得 2 个不同的结果:
第一种情况,锁打开后才能开始任务
在第二种情况下,您将启动一个任务,该任务在锁打开之前不会执行任何操作。
在我看来,直到你需要它才打开一个任务,是一个更好的方法,但这只是个人意见。开锁后,分配无用资源
你的第一种方法是完全错误的。 Task.Run
可以在同一线程上同步执行工作 或将其排队到线程池。 你不知道会发生什么。
您不是在等待任务完成,因此如果它排队到线程池,您的函数将释放锁并 return,甚至可能在工作开始之前。
一般来说,最佳做法是只在需要的时候获取锁,并且永远不要在等待另一个线程时持有锁,因为如果你不是非常的话,很容易导致死锁小心。