有没有办法在异步代码中强制上下文切换而不需要 Task.Delay

Red*_*ood 5 c# asynchronous async-await

我的代码看起来像这样:

我试图避免将它放在 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
    }
}
Run Code Online (Sandbox Code Playgroud)

当我工作量很大并遇到此问题时,我正在尝试取消单元测试。

And*_*nko 6

尝试

async Task DoSomething(CancellationToken ct)
{
    while (!ct.IsCancellationRequested)
    {
        //await Task.CompletedTask; //you can omit this line
        await Task.Yield();
    }
}
Run Code Online (Sandbox Code Playgroud)