这是在不创建后台线程的情况下使同步库函数不可用的方法吗
本文关键字:库函数 同步 方法 情况下 创建 后台 线程 | 更新日期: 2023-09-27 17:59:08
我需要获取一个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;
}
"awaitability"的全部意义在于,一些指令是在后台执行的,允许您的代码继续执行。
什么意思是"让同步函数在没有线程的情况下不可用"?同步函数(与依赖硬件的真正异步函数相反)需要CPU来运行,因此它需要一个线程。否则,如果它是在没有新线程的情况下执行的,那么"awaitablility"就没有意义了(它将阻塞)。顺便说一句,如果你关心系统资源,那么。Net Task机制可能不会生成新的系统线程,而是重用已经为Task创建的线程。
我需要使用一个I/O绑定的第三方函数并对其进行转换,这样它就可以在不创建后台线程的情况下使用。此调用没有本机异步方法。
这是不可能的,对不起。
您最好的选择是联系第三方,要求他们提供异步API。
与此同时,您必须保留同步的API调用(如果您的应用程序是ASP.NET应用程序,或者调用代码已经在非UI线程上),或者将同步的API包装在Task.Run
中(如果它是从UI线程调用的)。