2010-01-07 44 views
2

是否有可能做的事:如何使用QueueUserWorkItem与ref/out状态?

ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), ref data); 

这样,我ThreadProc的可以使主叫方的数据指向一个不同的位置时,电话起源不是?

如果这是不可能的,有没有办法用IntPtr或类似的东西来实现这样的功能?

回答

1

不,只是因为WaitCallback(object state)的定义包含非参数参数。

如果可以的话,它本质上不会是线程安全的。

+0

..hahaha,我只是给我的回答加了同样的东西.. – 2010-01-07 21:07:58

1

不,QueueUserWorkItem不支持该签名,除此之外,这将是多线程应用程序中调试的噩梦。

1

不,并且试图自己实现这些功能是不可取的。线程的定义意味着您不知道何时将修改data的值。通过引用线程传递任何东西实际上可以保证某种竞争条件或并发违规。

2

在这里你去,充分的工作样本:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 

namespace ConsoleApplication19 { 
    class Program { 

     static object sync = new object(); 

     static void Main(string[] args) { 
      int counter = 0; 
      ThreadPool.QueueUserWorkItem(new WaitCallback((_) => ThreadProc(ref counter)), null); 

      while (true) { 
       lock (sync) { 
        if (counter == 1) break; 
       }  
       Thread.Sleep(1); 
      } 

      Console.Write(counter); 
      Console.Read(); 

     } 

     static void ThreadProc(ref int counter) { 
      lock (sync) { 
       counter++; 
      } 
     } 
    } 
} 

注:

从并发性的角度来看,你是在玩火大的时间。当这变得棘手时,你开始冒着死锁和各种坏事的风险。

+0

@ sam ..我不想发布任何代码示例,因为这非常非常危险。如果我发现这个代码在某个地方,我不认为我可以在晚上睡觉:)但是+1是一个完整的例子 – 2010-01-08 16:15:47

0

它很简单。 使用一个类对象作为状态对象。 事实上,对类对象的引用将通过线程创建来传递,因此您将拥有类public属性作为线程制造者和创建线程之间的相互变量。