[英]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.