【发布时间】:2012-04-28 07:56:08
【问题描述】:
ReSharper 重构了一个 foreach 循环,我不得不这样做。我想通过委托的 BeginInvoke 使用不同的参数生成一堆线程,存储在列表中,并将 IAsyncResults 存储在集合中:
var asyncResults = mylist.Select(x => myDelegate.BeginInvoke(x, null, null));
我的本能反应是,这不是一个好习惯。 BeginInvoke 会导致产生新线程的副作用,传递给 Select 的函数不应引起副作用。
或者也许没关系,因为我没有更改调用线程中的任何内容?
【问题讨论】:
-
在你问自己“这是一个好习惯吗?”之前问问自己“这段代码是否实现了我所描述的行为?”它不是;此代码仅创建一个查询对象。您创建了一个对象,表示“我是从该列表生成一系列异步结果的查询”。 成为该查询不会导致该查询执行。如果您想执行查询并将结果存储在一个集合中,您将不得不编写更多代码。
-
它自己不会做任何事情,但在某些情况下它可能是合适的。但是,当您调用 BeginInvoke 时,我猜您通常希望线程在此时启动,因此在这种情况下,LINQ 查询与 foreach 循环完全不同。
标签: c# multithreading linq delegates side-effects