ReSharper重构了一个foreach循环,我不得不这样。我想通过一个带有不同参数的委托的BeginInvoke生成一堆线程,存储在一个列表中,并将IAsyncResults存储在一个集合中:
var asyncResults = mylist.Select(x => myDelegate.BeginInvoke(x, null, null));
我的本能反应是,这不是一个好习惯。 BeginInvoke导致产生新线程的副作用,传递给Select的函数不会导致副作用。
或者也许没关系,因为我没有改变调用线程中的任何内容?
答案 0 :(得分:3)
那应该没问题。创建一个新线程并不是一个副作用。你没有修改任何值。调用BeginInvoke
并存储生成的IAsyncResult
s。
但是,你必须记住,没有任何东西可以阻止。您必须自己管理所有内容的同步。
答案 1 :(得分:2)
我认为很难判断这是否是一种好习惯,这取决于你是如何使用它的。
但是使用这样的LINQ时要记住的重要事情是Select()
(以及许多其他LINQ方法)实际上并不迭代集合并执行代码。仅当您通过使用foreach
或ToArray()
对结果集合进行迭代时才会发生这种情况。