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();
}
}
}
これはコンソールアプリケーションなので、スレッドプールは継続に使用されます。出力:Task.Delay
インサイド
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)'は完了した 'Task'を返す必要はないと思います。 – svick
@svick私は 'Task.FromResult(true)'がより適切だと思っていますが、 'millisecondsDelay'を変更するだけで、同期と非同期の継続を簡単にシミュレートできるので、' Task.Delay(millisecondsDelay:0) 'が好きです。彼らはこの行動を変えるかもしれないと思いますか?それは私にとって大きな変化のように見えて、上記のコードを与えます。 – Noseratio