0

我创建了一个 WCF 服务,它使用异步模式异步执行冗长的操作。我参考了下面的链接以 在 ServiceContract中实现BeginAddNumbers和方法。http://aspalliance.com/1335_Asynchronous_Pattern_in_Windows_Communication_Foundation.5 一切正常。但我不明白为什么我们需要这种方法? EndAddNumbers

即使它在服务器上异步操作,客户端仍然会阻塞,我们
也必须在客户端异步调用此操作。  
因此,它总是在服务器上异步实现操作,而不是
最好在客户端异步调用操作以获得响应式 UI。

谁能帮我理解在服务器端实现异步操作的概念?有什么我需要一起玩的实际例子AsyncPattern=trueOperationContract

添加客户端代码。客户端使用 WPF 应用程序实现

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();
    }

谢谢,赫曼特

4

2 回答 2

0

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

另一个原因是可伸缩性:在服务器端将请求与 WCF 调度程序线程分离。这意味着不会阻塞 WCF 线程。

有关示例,请参见此处。

您甚至可以决定将其设为单向电话;并让客户定期轮询;事实上,这是我最喜欢的方法。

于 2013-06-03T13:22:42.843 回答
0

这篇文章有一些信息。

一般来说:

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

于 2013-06-03T13:18:25.447 回答