簡體   English   中英

異步/等待信號量僅限制最新任務

[英]Async/Await SemaphoreSlim only newest task

我使用軌跡欄作為形態圖像操作的輸入值控件。 此操作需要一段時間,因此我想使用async / await來保持軌跡欄滾動的平滑移動。

我做了什么:

private static SemaphoreSlim Sema = new SemaphoreSlim(1,1);
private async void Operation()
{
    if(pictureBox_Image.Image != null)
    {
        await Sema.WaitAsync();
        try
        {
            await Task.Run(() => DoStuff());
        }
        catch{}
        finally
        {
            Sema.Release();
        }
    }
 }

但是通過這種方式,它仍然可以計算所有跟蹤欄值的結果。

如何刪除所有等待的任務,因此在完成一個值的計算后,只有最新的任務/跟蹤欄值才可用於下一次計算?

例子:

跟蹤欄值[0,1,2,3,4,5,6]計算從0開始->完成並顯示結果->跟蹤欄值現在為4->僅使用1,2,3->不計算與4。

因此,還要為您的方法提供一個CancellationToken,並在取消該方法時采取相應的措施。 目前尚不清楚如何調用此方法,因此通常需要保留在調用站點提供令牌的最新CancellationTokenSource。 在下一次調用Operation之前,應將其取消。

private static SemaphoreSlim Sema = new SemaphoreSlim(1,1);
private async void Operation(CancellationToken ct = default)
{
    if(pictureBox_Image.Image != null)
    {
        await Sema.WaitAsync(ct); //throws if cancelled... will not proceed
        try
        {
            await Task.Run(() => DoStuff(ct)); //DoStuff should be checking this CT too
        }
        catch{}
        finally
        {
            Sema.Release();
        }
    }
 }

...在事件處理程序中使用:

currentCancellationTokenSource.Cancel(); //class property/field
currentCancellationTokenSource.Dispose();
currentCancellationTokenSource = new CancellationTokenSource();
Operation(currentCancellationTokenSource.Token);

這可能會導致在需要處理的地方導致OperationCanceledException。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM