var arguments = new double[] { 1d, 2d, 3d };
var result = arguments.Select(arg => Math.Sqrt(arg));现在想象一个异步方法,而不是Math.Sqrt (我不确定下面的方法是不是真正的async方法,但它的行为非常类似)
public void BeginSqrt(Action<double> callback, double argument)
{
Thread.Sleep(100);
callback(Math.Sqrt(argument));
}在不拆分代码的情况下,没有正确的方法调用这种方法。因此,让我们将这个异步方法与AutoResetEvent同步。我创建了一个助手类:
public class Synchronizer<T, TResult>
{
AutoResetEvent _autoResetEvent = new AutoResetEvent(false);
TResult _result;
public TResult Execute(Action<Action<TResult>,T> beginMethod, T argument)
{
beginMethod(Callback, argument);
_autoResetEvent.WaitOne();
return _result;
}
void Callback(TResult result)
{
_result = result;
_autoResetEvent.Set();
}
}使用这个类,我们可以:
var synchronizer = new Synchronizer<double, double>();
var result = arguments.Select(arg => synchronizer.Execute(BeginSqrt, arg));当我思考这个问题时,我在几分钟内创建了这个解决方案。有没有一种本地的替代方案?我确信我的解决方案有bug,因为它遗漏了一些锁。有没有一个更可靠的库可以做到这一点?
发布于 2009-11-22 02:00:35
使用Parallel LINQ,你可以这样写:
var arguments = new double[] { 1d, 2d, 3d };
var result = arguments.AsParallel().Select(arg => Math.Sqrt(arg));这将并行计算每个参数的平方根。这就是你想要实现的吗?
https://stackoverflow.com/questions/1776011
复制相似问题