这是在不创建后台线程的情况下使同步库函数不可用的方法吗

本文关键字:库函数 同步 方法 情况下 创建 后台 线程 | 更新日期: 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线程调用的)。