簡體   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