有效地暫停異步操作,等待用戶輸入
異步編程通常需要暫停長期運行的任務,直到用戶互動為止,例如單擊按鈕。 本文探討了暫停類似GetResults
的異步方法時忙碌待招待的有效替代方案,直到特定事件觸發。
>避免效率低下的輪詢
>連續檢查該事件(忙碌的播放)的傳統方法效率很低。 事件驅動的解決方案提供了一種更優雅和表現的方法。
>利用信號量
>SemaphoreSlim
類提供了堅固的基於信號量的解決方案。 初始化一個信號量為0,最大計數為1。 “繼續”按鈕的事件處理程序使用Release()
釋放信號量。 在GetResults
>中,await signal.WaitAsync()
阻止執行直到釋放信號量為止。
<code class="language-csharp">private SemaphoreSlim signal = new SemaphoreSlim(0, 1); private void ButtonContinue_Click(object sender, RoutedEventArgs e) { signal.Release(); } private async Task GetResults() { await signal.WaitAsync(); // Continue processing }</code>
>利用事件信號的taskCompletionsource
>另外,創建一個代表按鈕單擊結果的任務。 事件處理程序使用TaskCompletionSource<bool>
完成此任務。 SetResult()
等待此任務,暫停執行直到完成。 GetResults
>
<code class="language-csharp">private TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>(); private void ButtonContinue_Click(object sender, RoutedEventArgs e) { tcs.SetResult(true); } private async Task GetResults() { await tcs.Task; // Continue processing }</code>
以上是如何暫停異步方法,直到發生事件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!