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