WCF异步模式开始/结束任务会阻止客户端的GUI

时间:2012-04-28 18:43:32

标签: wcf asynchronous client task

我在WCF服务中有一个异步方法,以及使用此方法的客户端。当我调用该方法时,客户端的GUI将被阻止,直到异步方法完成。我的代码如下:

SERVICE

public IAsyncResult BeginAsyncMethod(CustomClass paramCustomClass, AsyncCallback callback, object state)
        {            
            Task<bool> task = Task<bool>.Factory.StartNew(p => slowMethod(paramCustomClass, state);
            return task.ContinueWith(res => callback(task));
        }


public bool EndAsyncMethod(IAsyncResult paramResult)
        {
            return ((Task<bool>)paramResult).Result;
        }

slowMethod是一个虚拟方法,其中for为i = 0到1000000000。

客户端

private void callAsyncMethod()
{
      Task<bool> task = Task<bool>.Factory.FromAsync(_proxy.Proxy.BeginAsyncMethod, _proxy.Proxy.EndAsyncMethod, CustomClass, null);    
      bool hasFinished= task.Result;
}

在客户端中,我有一个调用callAsyncMethod的按钮,当我单击该按钮时,在slowMethod运行时,GUI会变得臃肿。

如果我没有错,async方法会将控件返回给调用者,以避免程序被阻止,但在我的情况下,这不会发生。我误解了什么吗?我以错误的方式使用异步方法?

感谢。 Daimroc。

1 个答案:

答案 0 :(得分:2)

即使方法是异步的,您也在等待结果返回,从而有效地阻塞调用线程(UI)。当您访问Result对象的Task属性时,如果任务尚未完成,它将一直阻塞,直到结果可用。

您应该异步调用异步方法。如果您使用的是.NET 4.5,则可以使用await关键字:

private async void callAsyncMethod() 
{ 
    Task<bool> task = Task<bool>.Factory.FromAsync(_proxy.Proxy.BeginAsyncMethod, _proxy.Proxy.EndAsyncMethod, CustomClass, null);     
    bool hasFinished = await task;
}

否则你真的需要使调用异步

private void callAsyncMethod() {
    _proxy.Proxy.BeginAsyncMethod(CustomClass, null, MyCallback, _proxy);
}

private void MyCallback(IAsyncResult asyncResult) {
    bool hasFinished = _proxy.Proxy.EndAsyncMethod(asyncResult);
}