我需要采用I/O绑定的第三方函数,并在不创建后台线程的情况下将其转换为等待状态。此调用没有本地异步方法。这是否可以在不创建后台线程的情况下使同步库函数等待?
这是我的理解,这将工作,但它会创建一个后台线程,每次调用。
public string SomeSyncFunction()
{
Threading.Sleep(5000);
return "done";
}
//awaitable but creates a background thread
public Task<string> SomeSyncFunctionAsync()
{
return Task.Run(() => SomeSyncFunction());
}
我相信这是没有新线程的方式,但不完全确定。
public Task<string> SomeSyncFunctionAsync()
{
var tcs = new TaskCompletionSource<string>();
try
{
tcs.SetResult(SomeSyncFunction());
}
catch (Exception e)
{
tcs.SetException(e);
}
return tcs.Task;
}
嗯,它并没有真正使它异步。哎呀,你可以用'return Task.FromResult(SomeSyncFunction());'来简化它,但它不会实现异步。你希望通过让它保持等候状态来实现什么? –
我假设目标是更好的响应。 –
如果底层库已经在进行阻塞调用(除了替换库),后台线程是最好的。 –