我对WCF async的使用有益吗?

时间:2013-11-18 13:35:32

标签: c# .net wcf asynchronous async-await

我正在尝试快速转换几个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;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

如果这是你真正想要的结果,那么没有任何好处。您正在使用async WCF客户端保存线程,但之后您正在阻止Main中的线程。

但是,如果您的最终解决方案是UI项目,那么有一个好处:您可以避免阻止UI线程。或者,如果您的最终解决方案是ASP.NET网站,那么有一个好处:您使用async保存线程,但您不必阻止任何线程来执行此操作。在桌面应用程序(例如,控制台/ UI应用程序)中,线程非常“便宜”。 async的主要好处是避免阻止UI(如果有的话)。

如果您正在进行多个并发呼叫,那么async可以帮助您更清晰地执行代码。但如果它只是一个控制台应用程序中的单个WCF调用,那么实际上没有任何好处。

答案 1 :(得分:0)

我们在长时间运行的过程中使用async,您不希望冻结UI。如果您使用的是异步方法

  1. 如果你有相互依赖的任务,例如计算一个 结果你想要投入其他结果然后你需要恭维 异步。
  2. 如果您的任务是独立的,那么使用Async方法总是有利于您。
  3. 您应该放入异步方法的任何独立任务。这将为你提供快速响应和丰富的用户。
  4. Async还为超时操作提供时间标记。
  5. 异步剂量是什么,它将使用线程池来执行您的任务。这是由.net fremwork管理的。