WCF异步模式-真的需要吗?

WCF异步模式-真的需要吗?,wcf,asynchronous,Wcf,Asynchronous,我创建了一个WCF服务,它使用异步模式异步执行一个冗长的操作。我已经参考了下面的链接来实现ServiceContract中的BeginAddNumber和EndAddNumber方法。 一切正常。但我不明白为什么我们需要这种方法 Even though its asynchronous operation on server, client will still blocked and we have to invoke this operation asynchornously on cli

我创建了一个WCF服务,它使用异步模式异步执行一个冗长的操作。我已经参考了下面的链接来实现ServiceContract中的
BeginAddNumber
EndAddNumber
方法。
一切正常。但我不明白为什么我们需要这种方法

Even though its asynchronous operation on server, client will still blocked and we have to invoke this operation asynchornously on client as well. So instead of implementing operation asynchronously on server it's always better to invoke operation asynchronously on client side to have responsive UI. 谢谢,赫曼特有一些信息

一般而言:

对于WCF,realproxy的类型为System.ServiceModel.Channels.ServiceChannelProxy。此代理实现同步调用服务方法,即使我们使用BeginInvoke调用它。 WCF仅在代理上调用的方法以BeginXXX()开头并用[OperationContract(AsyncPattern=true)]属性修饰时才会发出异步调用


我喜欢实现这个服务器端的想法;并通过相应地命名操作来清楚地表明这一点。毕竟,如果调用本质上是异步的,为什么要让客户机选择呢

另一个原因是可伸缩性:在服务器端执行此操作会将请求与WCF dispatcher线程分离。这意味着WCF线程不会被阻塞

有关示例,请参见


你甚至可以决定打个单程电话;并让客户定期进行投票;事实上,这是我最喜欢的方法。

-链接对我来说是死的,它对你有用吗?它提供了我在实现IAsyncResult时遇到的最佳示例和解释Pattern@ilansch谢谢,但是我也无法访问该链接。试试这个示例,要点是在调用服务时,应该将操作发送到新线程中。开始操作不应该完成大部分工作,您应该将真正繁重的操作排队到新线程中。您是如何创建客户端的?是通过Visual Studio添加服务引用吗?@Aron我添加了客户端代码和一些注释,以澄清我的问题。@lgarioshka Thaks。但我的问题是,使用这种方法有什么好处?即使WCF发出异步调用,除非方法返回,否则客户端UI仍然会阻塞。我说的对吗?@user2243747当WCF服务使用该模式时,您可以从客户端异步调用它,这样UI就不会冻结。
private void button1_Click(object sender, RoutedEventArgs e)
    {
        MathOperationClient c = new MathOperationClient();
        Task t = new Task(new Action(() =>
        {                
            ///Even if AddNumbers is is implemented as asynchronous operation
            ///second call to AddNumbers get chance only after completing below
            ///call.  
            ///Note: AddNumbers method takes 10 sec to execute
            int nResult = c.AddNumbers(2, 3);                
            this.Dispatcher.BeginInvoke(new Action(()=>{
                label1.Content = nResult.ToString();
            })
           , null);
        }));


        t.Start();


        Task t1 = new Task(new Action(() =>
        {
            ///Below method is invoked only after executing first call ( above call with parameters 2 and 3 ) 
            ///in other words below call is blocked for 10 seconds.
            ///So what is advantage of implementing asynchronous AddNumbers method on server side?
            int result = c.AddNumbers(5,5);

            this.Dispatcher.BeginInvoke(new Action(() =>
            {
                label2.Content = result.ToString();
            })
           , null);
        }));

        t1.Start();
    }