首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何同步异步方法?

如何同步异步方法?
EN

Stack Overflow用户
提问于 2009-11-22 00:53:10
回答 1查看 1.8K关注 0票数 0
代码语言:javascript
复制
var arguments = new double[] { 1d, 2d, 3d };
var result = arguments.Select(arg => Math.Sqrt(arg));

现在想象一个异步方法,而不是Math.Sqrt (我不确定下面的方法是不是真正的async方法,但它的行为非常类似)

代码语言:javascript
复制
public void BeginSqrt(Action<double> callback, double argument)
{
    Thread.Sleep(100);
    callback(Math.Sqrt(argument));
}

在不拆分代码的情况下,没有正确的方法调用这种方法。因此,让我们将这个异步方法与AutoResetEvent同步。我创建了一个助手类:

代码语言:javascript
复制
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();
    }
}

使用这个类,我们可以:

代码语言:javascript
复制
var synchronizer = new Synchronizer<double, double>();
var result = arguments.Select(arg => synchronizer.Execute(BeginSqrt, arg));

当我思考这个问题时,我在几分钟内创建了这个解决方案。有没有一种本地的替代方案?我确信我的解决方案有bug,因为它遗漏了一些锁。有没有一个更可靠的库可以做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2009-11-22 02:00:35

使用Parallel LINQ,你可以这样写:

代码语言:javascript
复制
var arguments = new double[] { 1d, 2d, 3d };
var result = arguments.AsParallel().Select(arg => Math.Sqrt(arg));

这将并行计算每个参数的平方根。这就是你想要实现的吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1776011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档