等待循环的每次迭代中的任务

时间:2014-10-05 13:53:39

标签: c# for-loop asynchronous async-await

我想做什么:

我有一个带有计时器的服务,每隔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()试了一些东西,但我并不是真的明白这一点,也不是我需要的东西。

1 个答案:

答案 0 :(得分:1)

_timer_Elapsed方法每秒调用一次,并且每次启动新的异步任务以响应WaitAsynchronouslyAsync()方法调用。由于此异步任务需要5秒钟才能完成,并且每秒都会生成一个新的异步任务,因此您最多可以同时运行5个并发*任务。然后,一旦第一个异步任务完成(5秒后),第二个异步任务在完成之前只剩下一秒。等等。

这里的关键是你有多个同时运行的异步任务,并且始终会每秒调用_timer_Elapsed方法,而不管可能从先前的调用运行的任何异步任务。此外,_timer_Elapsed不会返回Task(并且无论如何都不能在这里,因为它是一个事件处理程序),因此调用者不知道任何可能从在方法内部。该方法在任务完成之前返回。

*请注意,这些任务可能不一定在不同的线程上运行,因此我使用&#34;并发&#34;松散地来到这里。有关详细信息,请参阅this