在C#中承诺/异步等待回调

时间:2018-10-15 20:14:14

标签: c# .net .net-core async-await

我有一个带有如下签名的c#函数: Foo(List<int> data, Action<string> endAction)

我无法更改Foo(这是一个外部库)。

我对c#还是很陌生,最近几年我主要从事JS开发,我想知道在JS-land中是否有类似于“ promisify”的东西。也就是说,使调用“ Foo”的函数异步并等待Foo调用endAction回调。

2 个答案:

答案 0 :(得分:3)

您可以如下使“ promisify” Foo:

static Task<string> FooAsync(List<int> data)
{
    var tcs = new TaskCompletionSource<string>();
    Action action = () => Foo(data, result => tcs.SetResult(result));
    // If Foo isn't blocking, we can execute it in the ThreadPool:
    Task.Run(action);
    // If it is blocking for some time, it is better to create a dedicated thread
    // and avoid starving the ThreadPool. Instead of 'Task.Run' use:
    // Task.Factory.StartNew(action, TaskCreationOptions.LongRunning);
    return tcs.Task;
}

现在您可以称之为:

string result = await FooAsync(myList);

答案 1 :(得分:2)

在C#/。NET中没有类似于promisify的内置方法,但是您可以使用TaskCompletionSource的实例来创建一个Task,该方法可以在回调被调用。

TaskCompletionSource<string> tcs = new TaskCompletionSource<string>();
Foo(list, (string callbackData) => { tcs.SetResult(callbackData); });
string result = await tcs.Task;