我想做什么:
我有一个带有计时器的服务,每隔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();
}
基本上我想要的是await
方法中的_timer_Elapsed
每次都会发生(所以每秒都应该等待5秒)而不是一次只持续5秒,然后是每秒。我用Task.WhenAll()
试了一些东西,但我并不是真的明白这一点,也不是我需要的东西。
答案 0 :(得分:1)
_timer_Elapsed
方法每秒调用一次,并且每次启动新的异步任务以响应WaitAsynchronouslyAsync()
方法调用。由于此异步任务需要5秒钟才能完成,并且每秒都会生成一个新的异步任务,因此您最多可以同时运行5个并发*任务。然后,一旦第一个异步任务完成(5秒后),第二个异步任务在完成之前只剩下一秒。等等。
这里的关键是你有多个同时运行的异步任务,并且始终会每秒调用_timer_Elapsed
方法,而不管可能从先前的调用运行的任何异步任务。此外,_timer_Elapsed
不会返回Task
(并且无论如何都不能在这里,因为它是一个事件处理程序),因此调用者不知道任何可能从在方法内部。该方法在任务完成之前返回。
*请注意,这些任务可能不一定在不同的线程上运行,因此我使用&#34;并发&#34;松散地来到这里。有关详细信息,请参阅this。