我有一個要求,在客戶端向單個網頁發出請求時,此網頁需要從兩個其他網頁中檢索結果。Web窗體應用程序中的多個後臺工作人員
我們要求信息的兩個網頁在返回結果之前執行一個過程,這個過程可能需要幾分鐘的時間,而不是啓動一個Web請求並等待它返回,然後開始另一個我想要消除後臺工作人員的這兩項請求,並將結果同時生成。
所以我的代碼看起來是這樣的(僞代碼):
var worker1 = new BackgroundWorker();
var worker2 = new BackgroundWorker();
worker1.DoWork += (s, e) => {
//Web Request done here
};
worker2.DoWork += (s, e) => {
//Web Request done here
};
worker1.RunWorkerAsync();
worker2.RunWorkerAsync();
//Some logic here that basically waits for both to return.
現在我注意到,結果仍然需要更長的時間來恢復比我預料的,所以我做了一下測試,並改變了內容在DoWork的對
using (var sw = new StreamWriter(@"c:\temp\TEST\Worker1.txt"))
{
for (int i = 0; i < 1000000; i++)
{
sw.WriteLine($"{i} - {DateTime.Now.ToLongTimeString()}");
}
}
爲了簡便起見,我不會複製此退了出來,但假設該文件的名稱改爲中worker2.txt第二工人的DoWork()
其原理我知道,但它的工作原理,它需要約3秒鐘的時間寫出100萬次,所以在第一個文件中,我看到從執行時間到執行時間+ 3秒的時間 在第二個文件中,我可以看到時間範圍從執行時間+3秒到執行時間+6秒。
所以很明顯,在這一點上,一名工人先被執行,然後是另一名工人,但我看不出爲什麼。
關於該項目的更多信息 - Web表單(這是我一直在考慮和必須堅持的要求).NET 4.5
**編輯補充:**
回來後這個問題我看了一下我正在調用的頁面,注意到它們在頁面聲明中有aspcompat = true,我認爲是導致該問題的原因(他們需要這個,我不能刪除它)。
我現在有哪些選擇?理想情況下,我希望能夠調用這些頁面並行運行,有沒有什麼辦法可以在aspcompat設置爲true的情況下實現這一目標?
編輯爲未來的讀者
注意,我上述的問題,這是提供的代碼是正確的,我有這個問題是,我是調用頁面被設置成使用ASPCOMPAT,它強制webforms在STA模式下工作,這是拋棄我的東西。
最後,上面的代碼沒有改變,解決方案是將頁面與後臺工作人員放在一個單獨的具有自己的應用程序池的Web應用程序中,該頁面使用後臺工作人員關閉頁面在其應用程序池中以aspcompat模式運行 - 它並不理想,但它仍然是我們想要的實時部署。
爲什麼不只是使用async/await?避免所有的BackgroundWorker廢話,然後'Task.WaitAll()'。 – axlj
與上述相同的行爲。 – D3vy