我有一个带有如下签名的c#函数:
Foo(List<int> data, Action<string> endAction)
我无法更改Foo(这是一个外部库)。
我对c#还是很陌生,最近几年我主要从事JS开发,我想知道在JS-land中是否有类似于“ promisify”的东西。也就是说,使调用“ Foo”的函数异步并等待Foo
调用endAction
回调。
答案 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;