C# 这是在不创建后台线程的情况下让同步库函数可以等待的方法吗?

C# 这是在不创建后台线程的情况下让同步库函数可以等待的方法吗?,c#,async-await,C#,Async Await,我需要一个第三方的功能,是I/O绑定和转换,所以它是等待没有创建一个后台线程。此调用没有本机异步方法 据我所知,这将起作用,但它将在每次调用时创建一个后台线程 public string SomeSyncFunction() { Threading.Sleep(5000); return "done"; } //awaitable but creates a background thread public Task<string> SomeSyncFunctionAsyn

我需要一个第三方的功能,是I/O绑定和转换,所以它是等待没有创建一个后台线程。此调用没有本机异步方法

据我所知,这将起作用,但它将在每次调用时创建一个后台线程

public string SomeSyncFunction()
{
  Threading.Sleep(5000);
  return "done";
}

//awaitable but creates a background thread
public Task<string> SomeSyncFunctionAsync()
{
  return Task.Run(() => SomeSyncFunction());
}
公共字符串SomeSyncFunction()
{
睡眠(5000);
返回“完成”;
}
//等待,但创建一个背景线程
公共任务SomeSyncFunctionSync()
{
返回任务。运行(()=>SomeSyncFunction());
}
我相信这是一种不用新线程就可以完成的方法,但还不能完全确定

public Task<string> SomeSyncFunctionAsync()
{
    var tcs = new TaskCompletionSource<string>();   
    try
    {
        tcs.SetResult(SomeSyncFunction());
    }
    catch (Exception e)
    {
        tcs.SetException(e);
    }

    return tcs.Task;
}
公共任务SomeSyncFunctionSync() { var tcs=new TaskCompletionSource(); 尝试 { SetResult(SomeSyncFunction()); } 捕获(例外e) { tcs.SetException(e); } 返回tcs.Task; } 整个“可等待性”的要点是,一些指令在后台执行,允许您的代码进一步执行

“使同步函数在没有线程的情况下可以等待”是什么意思?同步函数(与依赖硬件的真正异步函数相反)需要CPU来运行,因此它需要一个线程。否则,如果它在没有新线程的情况下执行,那么“等待性”就没有意义了(它将阻塞)。 顺便说一句,如果您关心系统资源,那么.Net任务机制可能不会产生新的系统线程,而是重新使用已经为任务创建的线程

我需要一个第三方的功能,是I/O绑定和转换,所以它是等待没有创建一个后台线程。此调用没有本机异步方法

对不起,这是不可能的

您最好的选择是联系第三方并向他们索取异步API


同时,您必须保持同步API调用(如果您的应用程序是ASP.NET应用程序,或者如果调用代码已经在非UI线程上),或者将同步API包装在
任务中。运行
(如果它是从UI线程调用的)。

好吧,这根本不会使它异步。见鬼,使用
return Task.FromResult(SomeSyncFunction())可以更简单地完成任务但它不能实现异步。让它成为可等待的,您希望实现什么?我假设目标是更好的响应性。如果基础库已经在进行阻塞调用(而不是替换库),则后台线程是您能够做到的最好的方法。您的操作可以在不使用线程的情况下完成吗?你有什么办法可以得到通知吗?如果两者都选择“是”,则可以使用
TaskCompletionSource
。但是为了使它有用,您必须能够在完成操作之前返回
任务
对象。上面的代码示例在您完成操作之前不会返回,这是无用的,根本不会使其异步。您所描述的是“异步过同步”,不推荐使用