等待多个回调

本文关键字:回调 等待 | 更新日期: 2023-09-27 18:35:54

我正在使用一个执行异步调用的库,当返回响应时,将调用一个带有结果的回调方法。这是一个简单的模式,但我现在遇到了一个障碍。如何对异步方法进行多次调用并等待(不阻塞)它们?当我从所有服务获取数据时,我想调用我自己的回调方法,该方法将获取异步方法返回的两个(或更多)值。

这里要遵循的正确模式是什么?顺便说一句,我无法更改库以使用 TPL 或其他东西......我必须忍受它。

public static void GetDataAsync(Action<int, int> callback)
{
    Service.Instance.GetData(r1 =>
    {
        Debug.Assert(r1.Success);
    });
    Service.Instance.GetData2(r2 =>
    {
        Debug.Assert(r2.Success);
    });
    // How do I call the action "callback" without blocking when the two methods have finished to execute?
    // callback(r1.Data, r2.Data);
}

等待多个回调

你想要的是一个类似倒计时事件的东西。 请尝试以下操作(假设您使用的是 .NET 4.0):

public static void GetDataAsync(Action<int, int> callback)
{
    // Two here because we are going to wait for 2 events- adjust accordingly
    var latch = new CountdownEvent(2);
    Object r1Data, r2Data;    
    Service.Instance.GetData(r1 =>
    {
        Debug.Assert(r1.Success);
        r1Data = r1.Data;
        latch.Signal();
    });
    Service.Instance.GetData2(r2 =>
    {
        Debug.Assert(r2.Success);
        r2Data = r2.Data;
        latch.Signal();
    });
    // How do I call the action "callback" without blocking when the two methods have finished to execute?
    // callback(r1.Data, r2.Data);
    ThreadPool.QueueUserWorkItem(() => {
        // This will execute on a threadpool thread, so the 
        // original caller is not blocked while the other async's run
        latch.Wait();
        callback(r1Data, r2Data);
        // Do whatever here- the async's have now completed.
    });
}

您可以对每次异步调用使用 Interlocked.Increment。 完成后,调用Interlocked.Decrement并检查零,如果为零,则调用自己的回调。 您需要将 r1 和 r2 存储在回调委托之外。