如何在 C# 中将同步函数包装为异步函数?

Yon*_*gyi 3 c# async-await

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

public void startDoSth(Action<string> onDone)
Run Code Online (Sandbox Code Playgroud)

startDoSth产生一个新线程来完成这项工作,并立即返回,当事情完成后,我的onDone函数将被调用。

我想编写一个如下所示的异步方法来包装它:

public async Task<string> doSthAsync();
Run Code Online (Sandbox Code Playgroud)

所以,有人可以这样称呼它:

string s = await doSthAsync()
onDone(s)
Run Code Online (Sandbox Code Playgroud)

doSthasync()我呼吁做startDoSth()真正的事情。但我不知道如何写doSthAsync()

谁能告诉我这是否可能以及如何做?多谢。

Joh*_*lay 6

您可以使用TaskCompletionSource将其转换为 TAP:

Task<string> DoSthAsync()
{
    var tcs = new TaskCompletionSource<string>();
    startDoSth(tcs.SetResult);
    return tcs.Task;
}
Run Code Online (Sandbox Code Playgroud)

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