[英]await task in each iteration of a loop
我想做的事:
我有一個帶有計時器的服務,該計時器每x秒執行一定的操作序列。 在某些情況下,必須等待其中一項操作(在現實生活中,這是某人通過聊天服務器的答復)。
我在下面嘗試過的方法有效,唯一的問題是這段代碼:
string result = await WaitAsynchronouslyAsync();
僅在第一次等待之后,在初始等待期之后,它每秒才放出一條線(這不是我想要的)
這是我的代碼:
static void Main(string[] args)
{
_timer.Start();
_timer.Interval = 1000;
_timer.Elapsed += _timer_Elapsed;
_timer.Enabled = true;
Console.Read();
}
static async void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
//this has to be done every second, regardless of the await below
Console.WriteLine(DateTime.Now + " - " + "Current iteration: " + GetNumber++);
//this needs to be awaited everytime (in real life this is waiting for a response from a user)
string result = await WaitAsynchronouslyAsync();
Console.WriteLine(result);
}
public static async Task<string> WaitAsynchronouslyAsync()
{
await Task.Delay(5000);
var x = GetAsyncNumber ++;
return x.ToString();
}
基本上,我想要的是_timer_Elapsed
方法內的await
每次都發生(因此每秒應等待5秒),而不僅僅是5秒一次,然后每秒一次。 我用Task.WhenAll()
嘗試了一些東西,但是我不太了解,它也不是我所需要的。
_timer_Elapsed
方法_timer_Elapsed
被調用一次,並且每次它將啟動新的異步任務以響應WaitAsynchronouslyAsync()
方法調用時。 由於此異步任務需要5秒鍾才能完成,並且每秒都會產生一個新的異步任務,因此您一次最多可以運行5個並發*任務。 然后,第一個異步任務完成后(5秒后),第二個異步任務僅剩一秒鍾才完成。 等等。
這里的關鍵是,您有多個異步任務同時運行,並且_timer_Elapsed
方法總是每秒調用一次,而不管先前調用中正在運行的異步任務如何。 另外, _timer_Elapsed
不會返回Task
(並且由於它是事件處理程序,因此在此也無法返回),因此調用方不知道可能從方法內部啟動的任何異步任務。 該方法在任務完成之前返回。
*請注意,這些任務可能不一定在單獨的線程上運行,因此在這里我寬松地使用“並發”一詞。 請參閱此以獲取更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.