簡體   English   中英

如何同步異步方法?

[英]How to synchronize asynchronous methods?

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));

我在思考問題的幾分鍾內創建了此解決方案。 有本地替代方法嗎? 我確定我的解決方案存在錯誤,因為它缺少一些鎖定。 有一個更成熟的庫可以做到這一點?

使用並行LINQ,您可以編寫:

var arguments = new double[] { 1d, 2d, 3d };
var result = arguments.AsParallel().Select(arg => Math.Sqrt(arg));

這將並行計算每個參數的平方根。 這就是您要達到的目標嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM