我正在尝试快速转换几个WCF调用以使用异步生成的方法。在我们的代码中使用async / await仍然有点新鲜(我主要是一个Web开发人员),并希望看看我的方法是否提供了一些好处。
在下面的代码中,我仍然需要将结果返回给调用者,因此整个操作本身在感知上仍然是“同步的”,但是在等待之前似乎没有使当前线程挨饿,这是我想要完成的事情。
即使我的调用者(在这种情况下是Main)本身不是异步的(它不可能),这种方法还有什么好处吗?基本上,我所做的就是使用async / await关键字并使用Async WCF方法。感谢。
(console.writelines仅用于测试)
class Program
{
static void Main(string[] args)
{
var result = WcfAsync();
Console.WriteLine(result.Result);
Console.ReadLine();
}
private async static Task<bool> WcfAsync()
{
using (var svc = new EmailVendorService.EmailVendorServiceWCFClient())
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId); // Current thread ID
try
{
// long running task to vendor API
var result = await svc.ExecuteProgramAsync("SomeProgram", "start");
Console.WriteLine(Thread.CurrentThread.ManagedThreadId); // Outputs different thread's ID
return result;
}
catch
{
return false;
}
}
}
}
答案 0 :(得分:2)
如果这是你真正想要的结果,那么没有任何好处。您正在使用async
WCF客户端保存线程,但之后您正在阻止Main
中的线程。
但是,如果您的最终解决方案是UI项目,那么有一个好处:您可以避免阻止UI线程。或者,如果您的最终解决方案是ASP.NET网站,那么有一个好处:您使用async
保存线程,但您不必阻止任何线程来执行此操作。在桌面应用程序(例如,控制台/ UI应用程序)中,线程非常“便宜”。 async
的主要好处是避免阻止UI(如果有的话)。
如果您正在进行多个并发呼叫,那么async
可以帮助您更清晰地执行代码。但如果它只是一个控制台应用程序中的单个WCF调用,那么实际上没有任何好处。
答案 1 :(得分:0)
我们在长时间运行的过程中使用async,您不希望冻结UI。如果您使用的是异步方法
异步剂量是什么,它将使用线程池来执行您的任务。这是由.net fremwork管理的。