我正在尝试快速转换几个 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;
}
}
}
}
最佳答案
如果这就是你真正想要的结果,那么就没有任何好处。您正在使用 async
WCF 客户端保存线程,但随后会在 Main
中阻塞线程。
但是,如果你的最终解决方案是一个 UI 项目,那么有一个好处:你可以避免阻塞 UI 线程。或者,如果您的最终解决方案是 ASP.NET 网站,则有一个好处:您可以使用 async
保存线程,但不必阻止任何线程来执行此操作。在桌面应用程序(例如控制台/UI 应用程序)中,线程非常“便宜”。 异步
的主要好处是避免阻塞 UI(如果有的话)。
如果您正在进行多个并发调用,那么async
可以帮助您的代码更加清晰。但如果它只是控制台应用程序中的单个 WCF 调用,那么实际上并没有任何好处。
关于c# - 使用 WCF 异步有好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20049160/