我的代碼看起來像:
我試圖避免將它放在 Task.Run 中,因為它是異步的并且應該在主執行緒上運行良好
但是它不會進行背景關系切換(并且將永遠運行),除非我將 Task.Delay 插入回圈
有沒有更好的方法來實作這一點(沒有 Task.Run)?
var tasks = new List<Task>();
var cts = new CancellationTokenSource();
tasks.Add(DoSomething(cts.Token));
cts.Cancel();
Task.WaitAll(tasks.ToArray());
Console.WriteLine("Done");
async Task DoSomething(CancellationToken ct)
{
while (!ct.IsCancellationRequested)
{
await Task.CompletedTask;
await Task.Delay(1); // Without this is doesn't do context switch
}
}
當我的作業量很大并遇到此問題時,我正在嘗試對取消進行單元測驗。
uj5u.com熱心網友回復:
嘗試
async Task DoSomething(CancellationToken ct)
{
while (!ct.IsCancellationRequested)
{
//await Task.CompletedTask; //you can omit this line
await Task.Yield();
}
}
uj5u.com熱心網友回復:
如果要模擬一個可取消的操作,最簡單的方法大概是這樣:
Task DoSomething(CancellationToken cancellationToken)
{
return Task.Delay(Timeout.Infinite, cancellationToken);
}
該cancellationToken引數具有取消語意,這意味著當令牌被取消時,Task將轉換到Canceled狀態。如果您希望它具有停止語意,這是 a 的非標準語意CancellationToken,您可以這樣做:
async Task DoSomething(CancellationToken stoppingToken)
{
try { await Task.Delay(Timeout.Infinite, stoppingToken); }
catch (OperationCanceledException) { }
}
現在當令牌被取消時,Task將轉換到RanToCompletion狀態。請注意,CancellationToken在標準 .NET 庫中很少會看到具有停止語意的引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/337230.html
上一篇:依賴注入中的AddScoped
下一篇:如何使用嵌套的if條件優化方法
