C# 这是在不创建后台线程的情况下让同步库函数可以等待的方法吗?
我需要一个第三方的功能,是I/O绑定和转换,所以它是等待没有创建一个后台线程。此调用没有本机异步方法 据我所知,这将起作用,但它将在每次调用时创建一个后台线程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
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
。但是为了使它有用,您必须能够在完成操作之前返回任务
对象。上面的代码示例在您完成操作之前不会返回,这是无用的,根本不会使其异步。您所描述的是“异步过同步”,不推荐使用