我需要採用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());'來簡化它,但它不會實現異步。你希望通過讓它保持等候狀態來實現什麼? –
我假設目標是更好的響應。 –
如果底層庫已經在進行阻塞調用(除了替換庫),後臺線程是最好的。 –