Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# 锁定QueueUserWorkItem_C#_.net_Multithreading - Fatal编程技术网

C# 锁定QueueUserWorkItem

C# 锁定QueueUserWorkItem,c#,.net,multithreading,C#,.net,Multithreading,这里有一个简单的线程练习。假设我有一个静态锁、一个web请求和一个线程队列线程。以下情况是否会导致问题(忽略代码本身的质量): 该示例是人为设计的,但概念是:)。这不会导致问题。如果只调用一次,DoStuff()将无法获取锁,直到Update()的代码退出锁。但是,ThreadPool.QueueUserWorkItem是一个异步调用,因此可以释放锁,从而允许DoStuff()进行处理。这不会导致问题。如果只调用一次,DoStuff()将无法获取锁,直到Update()的代码退出锁。但是,Thr

这里有一个简单的线程练习。假设我有一个静态锁、一个web请求和一个线程队列线程。以下情况是否会导致问题(忽略代码本身的质量):


该示例是人为设计的,但概念是:)。

这不会导致问题。如果只调用一次,
DoStuff()
将无法获取锁,直到
Update()
的代码退出锁。但是,
ThreadPool.QueueUserWorkItem
是一个异步调用,因此可以释放锁,从而允许
DoStuff()
进行处理。

这不会导致问题。如果只调用一次,
DoStuff()
将无法获取锁,直到
Update()
的代码退出锁。但是,
ThreadPool.QueueUserWorkItem
是一个异步调用,因此可以释放锁,从而允许
DoStuff()
进行处理。

不应该这样做。线程池线程唯一的问题是线程池增长相对缓慢,因此如果您阻塞了大量等待锁定的程序,可能会导致性能问题。

不应该。线程池线程唯一的问题是线程池增长相对缓慢,因此如果你阻塞了大量等待锁的时间,可能会导致性能问题。

如果你问的是死锁,这里就没有。如果你问的是死锁,这里就没有。好吧,我也很确信这一点,但是我需要让我的头脑清醒一分钟——谢谢。好吧,我对同样的事情很有信心,但是我需要让我的头脑清醒一分钟——谢谢。
static object locker = new object();
static MyObject obj = new MyObject();

public static void Update(){
   lock(locker){
      obj.Foo = "biz";
      DoStuff();
   }
}

public static void DoStuff(){
   ThreadPool.QueueUserWorkItem(args => {
      lock(locker){
         obj.Foo = "bar";
      }
   });
}