(OBS:英語は母国語ではありませんが、この質問のタイトルは良いものではありませんが、質問自体を明確にするために努力しました)のはts
は高価な計算を行いyield return
方法を使用して生成されたとしましょう -複数のアイテムが1つのスレッドで生成されるのを待つ
のは、私は多くのアイテムを持っているIEnumerable<T> ts
があり、各MoveNextメソッド()は非常に高価であると仮定しましょう。
コードのこの作品を見てみましょう。
var enumerator = ts.GetEnumerator();
while (true) {
T t = await TaskEx.Run<T>(() => enumerator.MoveNext() ?
enumerator.Current :
null);
if (t == null) break;
t.DoSomeLightweigthOperation();
}
それは(私の場合、UIスレッドで、)メインスレッドをブロックせずに、非同期的に収集ts
を消費します。問題は、それはts
の各項目の1つのスレッドを生成することです。ジョブ全体を実行するスレッドを1つだけ使用して同じことを行う(単純な)方法はありますか?
だから、ちょうど私が唯一つのスレッドを使用してこれらの項目を生成したい、自分自身を明確にするが、私はTask
Sのコレクションのいくつかの種類(またはGetAwaiter
と他のクラス)を取得する必要がありますするには、私は後にawait
をできるように、これらの項目のそれぞれの生成。
ThreadPool.QueueUserWorkItem(_ =>
{
foreach(T t in ts)
{
t.DoSomeLightweigthOperation();
}
});
だけで、スレッドプールからのスレッド上で、それを通る:あなたがしたいすべてが別のスレッド上のTSを介して実行された場合
OK、ありがとう。私のIEnumeratorはコンパイラによって書かれています。imはimを使ってyield returnメソッドを使用しているからです。非同期にする方法はありますか? – Player
簡単にはありません。まだ組み込みの言語サポートはありません。あなた自身の非同期列挙子/列挙可能な実装を書いてそれに投稿する必要があります。 Ix_Experimental-Asyncには、使用できるビルディングブロックがいくつかある可能性があります。 –