讓我們假設我有這個簡單的代碼片段:如何序列化異步/等待?
async void button_Click(object sender, RoutedEventArgs e)
{
await Task.Factory.StartNew(() =>
{
Console.WriteLine("start");
Thread.Sleep(5000);
Console.WriteLine("end");
});
}
顯然,每次我推該按鈕時,前面的任務仍然運行一個新的任務甚至開始。我將如何推遲任何新任務,直到所有先前的任務完成?
更多的細節:
在上面的例子中,每個新的任務是相同的前任務。但是,在原始環境中,任務順序很重要:參數可能會改變(我可以使用DateTime.Now.Ticks
「模擬」它)。 這些任務應該按照他們「註冊」的順序執行。具體來說,我的程序會與串口設備通信。我之前使用BlockingCollection
做了這個後臺線程。但是,這次有一個嚴格的請求/響應協議,如果可能,我想使用異步/等待。
可能的解決辦法:
我可以想像創建任務,並將它們存儲在列表中。但是,我將如何執行與要求相關的任務?或者我應該回到之前用過的基於線程的解決方案嗎?
您仍然可以使用'ConcurrentQueue'或'BlockingCollection'。由於這是一個生產者 - 消費者的情況,後者應該是最合適的。 –
當然。但正如我所看到的,我需要在隊列中等待並循環它。我會存儲「任務」或數據以創建任務嗎?我會在「Task」中循環隊列還是循環啓動「Task」?儘管如此,這並不是什麼大問題,但我希望有另一種更適合這種請求/響應模式的方式。 – JeffRSon