如何在C#中将同步函数转换为异步函数?

3

我正在使用一种同步的第三方函数,我无法修改,例如:

public void startDoSth(Action<string> onDone)

startDoSth启动一个新线程来执行任务,并立即返回,当任务完成时,将调用我的onDone函数。

我想写一个下面这样的异步方法来包装它:

public async Task<string> doSthAsync();

因此,有人可以这样调用:

string s = await doSthAsync()
onDone(s)

doSthAsync()中,我调用startDoSth()来执行实际的操作。但是我不知道如何编写doSthAsync()。请问有人能告诉我是否有可能以及如何做到吗?非常感谢。

2
这可能会有所帮助 https://stackoverflow.com/questions/57887255/wrap-a-callback-into-async-task - juharr
当你可以使用 Task.Run 时,为什么需要这个方法呢? - asaf92
2
@asaf92 在这里使用 Task.Run 会有什么作用?根据 OP 的说法,工作已经在新线程上运行了。 - Johnathan Barclay
哦,我的错,我以为 onDone 参数是实际正在进行的工作。 - asaf92
1个回答

6
你可以使用 TaskCompletionSource 将其转换为 TAP:
Task<string> DoSthAsync()
{
    var tcs = new TaskCompletionSource<string>();
    startDoSth(tcs.SetResult);
    return tcs.Task;
}

SetResult 完成返回的 Task(并设置结果),以便可以将其作为回调函数传递。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接