爲什麼此代碼在Windows和Linux上(使用Mono)的行爲不同?.Net和Mono中的C#Task.WaitAll()
static void Main(string[] args)
{
Stopwatch stopwatch = Stopwatch.StartNew();
Task[] tasks = new Task[1];
tasks[0] = Task.Run(() =>
{
IPHostEntry iphe = Dns.GetHostEntry("8.8.8.8.dnsrbl.org");
});
Task.WaitAll(tasks, 2000);
Console.WriteLine("Done in " + stopwatch.ElapsedMilliseconds + " ms");
}
8.8.8.8.dnsrbl.ru
是一個最終會超時的查詢的例子。我相信沒有工作的DNS服務器(或者它的防火牆阻止了我)。
無論如何,重點不在於從DNS服務器獲得結果,關鍵是Task.WaitAll()
在等待包含調用Dns.GetHostEntry()
的任務時如何在Windows和Mono上運行。
在Windows上,如果查詢在超時期限(2s)內沒有返回任何結果,程序將運行或多或少的2秒。也就是說,帶有超時的Task.WaitAll似乎工作。使用Mono在Linux上運行此程序需要2秒鐘才能獲得輸出,但程序不會終止,直到任務退出。這是爲什麼?
似乎我得到相同的執行時間,無論我是否使用Time.WaitAll超時或不。
線索在Dns.GetHostEntry()
,因爲Task.WaitAll()
按預期工作,如果我使用Thread.Sleep()
模擬長時間運行的任務來啓動任務。 可正常工作:
tasks[0] = Task.Run(() => Thread.Sleep(10000));
是否有辦法在單聲道運行時強制
Task.WaitAll(Task[] tasks, int millisecondsTimeout)
實際超時?
編輯:Task.WaitAll()確實在超時時間後返回,但程序在單聲道中運行時不會終止(直到Dns.GetHostEntry
超時)。
它不是編譯器。無論使用Visual Studio還是Mono C#編譯器進行編譯,我都可以得到相同的結果。
但是你說'Task.WaitAll'正確超時甚至在單(你在2秒內得到輸出,這意味着任務.WaitAll在2秒內返回)。 – Evk
是的,我的壞。抱歉。該計劃似乎在等待。我將編輯該問題。 –
如果你刪除了'Task.WaitAll'並且在裏面用'Dns.GetHostEntry'開始新任務呢?這也會阻止程序完成嗎? – Evk