2

ReSharper 重构了一个 foreach 循环,我不得不这样做。我想通过委托的 BeginInvoke 使用不同的参数生成一堆线程,存储在列表中,并将 IAsyncResults 存储在集合中:

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

我的本能反应是,这不是一个好习惯。BeginInvoke 导致产生新线程的副作用,传递给 Select 的函数不应引起副作用。

或者也许没关系,因为我没有更改调用线程中的任何内容?

4

2 回答 2

3

那应该没问题。创建一个新线程并不是真正的副作用。您没有修改任何值。BeginInvoke被调用并且您正在存储结果IAsyncResults.

但是,您必须记住,没有什么会阻止。您必须自己管理所有内容的同步。

于 2012-04-17T00:16:29.863 回答
2

我认为很难说这是否是一个好习惯,这取决于你如何使用它。

但是在像这样使用 LINQ 时要记住的重要一点是Select()(以及许多其他 LINQ 方法)实际上并不遍历集合并执行您的代码。仅当您迭代生成的集合时才会发生这种情况,通常使用foreachor ToArray()

于 2012-04-17T00:44:16.787 回答