2010-01-07 66 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屬性作爲線程製造者和創建線程之間的相互變量。