關於ThreadPool.RegisterWaitForSingleObject
,這是而不是每個註冊(合併或其他)註冊一個線程。您可以輕鬆地測試:請在LINQPad下面的腳本,調用這個方法20000次:
static ManualResetEvent _starter = new ManualResetEvent (false);
void Main()
{
var regs = Enumerable.Range (0, 20000)
.Select (_ => ThreadPool.RegisterWaitForSingleObject (_starter, Go, "Some Data", -1, true))
.ToArray();
Thread.Sleep (5000);
Console.WriteLine ("Signaling worker...");
_starter.Set();
Console.ReadLine();
foreach (var reg in regs) reg.Unregister (_starter);
}
public static void Go (object data, bool timedOut)
{
Console.WriteLine ("Started - " + data);
// Perform task...
}
如果代碼捆綁20000個線程5秒的持續時間「等待」,它不可能工作。
編輯 - 響應:
「這是一個證明,但仍然有一個線程這僅檢查 信號線程池中。?」
這是一個實現細節。是的,它可能用一個單獨的線程實現,該線程將回調卸載到託管線程池,儘管不能保證這一點。等待句柄最終由操作系統管理,這也很可能觸發回調。它可能在其內部實現中使用一個線程(或少量線程)。或者使用中斷,它可能不會阻塞單個線程。它甚至可能因操作系統版本而異。這是一個與我們無關的實現細節。
RegisteredWaitHandle – 2012-07-08 08:44:29
@Royi Namir:查看我的編輯。 – Tudor 2012-07-08 08:52:15
我不認爲你是正確的問候'RegisteredWaitHandle':請參閱我的編輯。 – 2012-07-08 09:03:55