锁定QueueUserWorkItem

时间:2013-10-10 22:28:42

标签: c# .net multithreading

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

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";
      }
   });
}

这个例子是人为的,但这个概念仍然存在:)。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

不应该。特定于线程池线程的唯一问题是线程池增长相对较慢,因此如果您阻塞了很多等待锁定,则可能会导致性能问题。