SO 私は最近、ネットの Async CTP について大量の本を読んでいますが、「非同期とは、新しいスレッドを開始することではなく、作業を多重化することです」、「マルチスレッドを使用しない非同期は、 [協調的マルチタスキングと同じ考え方] あるタスクをしばらく実行し、そのタスクが制御を譲ると、そのスレッドで別のタスクをしばらく実行します。
このような発言が純粋に (まあ、ほとんど) 難解で学術的なものなのか、それとも "await" 経由で開始したタスクを UI スレッドで魔法のように実行できるようにする、見落としている言語構造があるのかどうかを理解しようとしています。
Eric Lippert は彼のブログで、マルチスレッドなしで Asyncrhony を使用する方法のデモンストレーションとして、次の例を示しています。
async void FrobAll()
{
for(int i = 0; i < 100; ++i)
{
await FrobAsync(i); // somehow get a started task for doing a Frob(i) operation on this thread
}
}
さて、ここで私が興味をそそられるのは、「...このスレッドで Frob(i) 操作を実行するための開始済みタスクを取得する」というコメントです。
これはどのように可能ですか?これは主に理論的な発言ですか?これまでのところ、タスクが別のスレッドを必要としないように見える唯一のケース (コードを調べない限り、確かなことはわかりません) は、Task.Delay() のようなもので、これはなくても待機できます。別のスレッドを開始します。しかし、私はそのためのコードを書いていないので、これは特殊なケースだと考えています。
実行時間の長い独自のコードの一部を GUI スレッドからオフロードしたい平均的なユーザーにとって、私たちは主に Task.Run のようなことをして作業をオフロードすることについて話しているのではないでしょうか。スレッド?もしそうなら、なぜ、非同期処理とマルチスレッド処理を混同しないように、このすべての腕が放棄されているのでしょうか?