繁体   English   中英

在循环的每个迭代中等待任务

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM