通过LINQ选择调用坏代码产生新线程?

时间:2012-04-17 00:12:52

标签: c# multithreading linq delegates side-effects

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

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

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

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

2 个答案:

答案 0 :(得分:3)

那应该没问题。创建一个新线程并不是一个副作用。你没有修改任何值。调用BeginInvoke并存储生成的IAsyncResult s。

但是,你必须记住,没有任何东西可以阻止。您必须自己管理所有内容的同步。

答案 1 :(得分:2)

我认为很难判断这是否是一种好习惯,这取决于你是如何使用它的。

但是使用这样的LINQ时要记住的重要事情是Select()(以及许多其他LINQ方法)实际上并不迭代集合并执行代码。仅当您通过使用foreachToArray()对结果集合进行迭代时才会发生这种情况。