Delay(0)
是否始終處於內聯狀態?根據我的經驗,它可以:Task.Yield()與Task.Delay(0)
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication
{
class Program
{
static async Task Test()
{
await Task.Yield();
Console.WriteLine("after Yield(), thread: {0}", Thread.CurrentThread.ManagedThreadId);
await Task.Delay(0);
Console.WriteLine("after Delay(0), thread: {0}", Thread.CurrentThread.ManagedThreadId);
await Task.Delay(100);
Console.WriteLine("after Delay(100), thread: {0}", Thread.CurrentThread.ManagedThreadId);
}
static void Main(string[] args)
{
Console.WriteLine("Main thread: {0}", Thread.CurrentThread.ManagedThreadId);
Test().Wait();
}
}
}
這是一個控制檯應用程序,因此線程池用於延續。輸出:
Main thread: 11
after Yield(), thread: 7
after Delay(0), thread: 7
after Delay(100), thread: 6
太好了,謝謝!在我看來,像一個方便的方式來創建一個非通用的[任務完成狀態](http://stackoverflow.com/a/18527377/1768303)。接受達米安的答案在技術上他是第一個:] – Noseratio
@Noseratio我認爲使用類似「Task completed = Task.FromResult(true);'更好,因爲它可以保證工作。我認爲'Task.Delay(0)'不需要返回完成的'任務'。 – svick
@svick,我同意'Task.FromResult(true)'更合適,但我仍然喜歡'Task.Delay(millisecondsDelay:0)',因爲我可以通過改變'millisecondsDelay'輕鬆地模擬同步和異步延續。你認爲他們可能會改變這種行爲?對我來說,這看起來像是一個突破性的變化,給出了上面的代碼。 – Noseratio