2

ReSharper は、私が持っていた foreach ループをこのようなものにリファクタリングしました。デリゲートの BeginInvoke を介して一連のスレッドを生成し、さまざまなパラメーターをリストに格納して、IAsyncResults をコレクションに格納したいと考えました。

var asyncResults = mylist.Select(x => myDelegate.BeginInvoke(x, null, null));

私の本能的な反応は、これは良い習慣ではないということです。BeginInvoke は新しいスレッドが生成されるという副作用を引き起こしていますが、Select に渡された関数は副作用を引き起こすべきではありません。

それとも、呼び出しスレッドで何も変更していないので、大丈夫ですか?

4

2 に答える 2

3

それでいいはずです。新しいスレッドを作成することは、実際には副作用ではありません。値を変更していません。が呼び出され、結果の sBeginInvokeを格納しています。IAsyncResult

ただし、何もブロックされないことを覚えておく必要があります。すべての同期を自分で管理する必要があります。

于 2012-04-17T00:16:29.863 に答える
2

これが良い習慣であるかどうかを判断するのは難しいと思います。それは、どのように使用しているかによって異なります。

しかし、このように LINQ を使用するときに覚えておくべき重要なことは、Select()(および他の多くの LINQ メソッド) は実際にはコレクションを反復処理してコードを実行しないということです。foreachこれは、通常はorを使用して、結果のコレクションを反復処理する場合にのみ発生しますToArray()

于 2012-04-17T00:44:16.787 に答える