試圖瞭解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");
});
我不明白你正在嘗試做的,你想打電話'ThreadPool.QueueUserWorkItem(MethodA);'但你仍然想'bigS'傳遞給MethodA? –
在試圖調用'ToString()'之前,先檢查對象是否爲空。不,你不能避免這種情況,如果有任何可能的對象可以爲空。有快捷方式可以使這種檢查更容易;請參閱http://www.dotnetperls。com/null-coalescing –
我知道如果我想在生產代碼中使用o,我需要保護它,我只是在試驗如何使用帶參數的方法的其他QueueUserWorkItem變體,只是檢查是否可以通過該參數莫名其妙。 – RotatingWheel