2015-10-29 29 views
0

試圖瞭解ThreadPool方法QueueUserWorkItem的兩種變體。如何使用QueueUserWorkItem的兩個變體

string bigS = "Big Stupid"; 
ThreadPool.QueueUserWorkItem(s => 
{ 
    Console.WriteLine("Working on a thread from threadpool B"); 
    Console.WriteLine("s = {0}", s.ToString()); 
}, bigS); 

ThreadPool.QueueUserWorkItem(MethodA, bigS); 

MethodA是這樣定義的。

private static void MethodA(object o) 
{ 
    Console.WriteLine("o = {0}", o.ToString()); 
} 

兩種方式都很好。但是QueueUserWorkItem還有另一種變體,它需要一個採用單個參數並返回void的方法的委託。所以methodA應該沒問題。但下面的代碼拋出異常,因爲我沒有通過MethodA中的對象o。我不想檢查MethodA中的o爲空。如何在第二種情況下將bigS傳遞給MethodA

ThreadPool.QueueUserWorkItem(MethodA); 

另一種方式可能是這樣的。但我想通過並訪問o。我可以做到這一點嗎?

ThreadPool.QueueUserWorkItem(o => 
{ 
Console.WriteLine("Working on a thread from threadpool"); 
}); 
+0

我不明白你正在嘗試做的,你想打電話'ThreadPool.QueueUserWorkItem(MethodA);'但你仍然想'bigS'傳遞給MethodA? –

+0

在試圖調用'ToString()'之前,先檢查對象是否爲空。不,你不能避免這種情況,如果有任何可能的對象可以爲空。有快捷方式可以使這種檢查更容易;請參閱http://www.dotnetperls。com/null-coalescing –

+0

我知道如果我想在生產代碼中使用o,我需要保護它,我只是在試驗如何使用帶參數的方法的其他QueueUserWorkItem變體,只是檢查是否可以通過該參數莫名其妙。 – RotatingWheel

回答

1

這不是從MSDN文檔很清楚,但

ThreadPool.QueueUserWorkItem(callback); 

相當於

ThreadPool.QueueUserWorkItem(callback, null); 

如果可選的參數存在在當時這個API已經取得,最有可能出現本來只是一種方法,如

public static bool QueueUserWorkItem(WaitCallback callBack, object state = null) 

但一方面documentation備註部分)很明確 - 如果您希望回調接收某些內容,您需要通過它,即使用state參數的超載。

0

鄰在

ThreadPool.QueueUserWorkItem(o => 
{ 
    Console.WriteLine("Working on a thread from threadpool"); 
}); 

永遠是零。它只是在那裏,因爲QueueUserWorkItem想要一個WaitCallback並且被定義爲Action<object>。我認爲微軟開發者並不想定義第二個代理。並且ThreadPoolActionFunc存在之前實施。

你可以與你的拉姆達

string bigS = "Big Stupid"; 
ThreadPool.QueueUserWorkItem(_ => 
{ 
    Console.WriteLine("Working on a thread from threadpool B"); 
    Console.WriteLine("s = {0}", bigS); 
}); 

或類似這樣的捕捉bigS如果你必須使用MethodA

string bigS = "Big Stupid"; 
ThreadPool.QueueUserWorkItem(_ => 
{ 
    MethodA(bigS); 
});