0

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

服务

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 的按钮,当我单击该按钮时,GUI 在 slowMethod 运行时被阻塞。

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

谢谢。戴姆洛克。

4

1 回答 1

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);
}
于 2012-04-29T00:20:49.530 回答