MSDNによるとasync
、await
新しいスレッドを作成しないでください。
async
andキーワードによって、追加のスレッドが作成されることはawait
ありません。
これを念頭に置いて、いくつかの単純なプログラムの制御フローを理解するのに苦労しています。私の完全な例を以下に示します。NuGet からインストールできるDataflow ライブラリが必要であることに注意してください。
using System;
using System.Threading.Tasks.Dataflow;
namespace TaskSandbox
{
class Program
{
static void Main(string[] args)
{
BufferBlock<int> bufferBlock = new BufferBlock<int>();
Consume(bufferBlock);
Produce(bufferBlock);
Console.ReadLine();
}
static bool touched;
static void Produce(ITargetBlock<int> target)
{
for (int i = 0; i < 5; i++)
{
Console.Error.WriteLine("Producing " + i);
target.Post(i);
Console.Error.WriteLine("Performing intensive computation");
touched = false;
for (int j = 0; j < 100000000; j++)
;
Console.Error.WriteLine("Finished intensive computation. Touched: " + touched);
}
target.Complete();
}
static async void Consume(ISourceBlock<int> source)
{
while (await source.OutputAvailableAsync())
{
touched = true;
int received = source.Receive();
Console.Error.WriteLine("Received " + received);
}
}
}
}
出力:
Producing 0
Performing intensive computation
Received 0
Finished intensive computation. Touched: True
Producing 1
Performing intensive computation
Received 1
Finished intensive computation. Touched: True
Producing 2
Performing intensive computation
Received 2
Finished intensive computation. Touched: False
Producing 3
Performing intensive computation
Received 3
Finished intensive computation. Touched: False
Producing 4
Performing intensive computation
Received 4
Finished intensive computation. Touched: True
これは、タスクが完了すると、ループの実行Consume
中に制御が与えられたことを示しているようです。for
OutputAvailableAsync
for (int j = 0; j < 100000000; j++)
;
これは、スレッド化されたモデルでは当然のことです。しかし、追加のスレッドが含まれていない場合、ループProduce
の途中で制御を譲るにはどうすればよいでしょうか?for