4

我得到了使用 WCF 从服务器请求数据的代码。

例如:

    public static Company LoadCompanyInfo(Guid session)
    {
        var client = new QualerServiceClient("QualerService");
        return client.GetCompanyInfo(session);
    }

我需要让我的 wpf 应用程序异步运行这些代码。

我尝试:

    public static Company LoadCompanyInfoAsync(Guid session)
    {
        var client = new QualerServiceClient("QualerService");
        client.BeginGetCompanyInfo(session, new AsyncCallback(EndLoadCompanyInfoAsync), client);

        // How to Get Data from AsyncCallback function?
        return null;
    }

    private static void EndLoadCompanyInfoAsync(IAsyncResult r)
    {
        var client = r.AsyncState as QualerServiceClient;
        var result = client.EndGetCompanyInfo(r);
        // how to return the result value ??
    }

但我不知道如何从回调函数返回数据。

我有方法:

  • BeginGetCompanyInfo 和 EndGetCompanyInfo

  • 获取公司信息异步

和事件:

  • 获取公司信息已完成。

问题

  1. 如何从回调方法中获取数据?

  2. GetCompanyInfoAsync和 和有什么不一样Begin\End

  3. 最佳实践:如何异步执行方法,使我的 WPF 应用程序的 GUI 不冻结?

4

3 回答 3

3

我假设您使用的是 VS2012。

首先,如果您的目标是 .NET 4.0,则安装(通过 NuGet)Async Targeting 包。如果您的目标是 .NET 4.5,则无需做任何特别的事情。

接下来,重新创建您的客户端代理。现有的//Begin端点将被单个End.AsyncTask<Company> GetCompanyInfoAsync(Guid)

现在你可以像这样使用它:

public static Task<Company> LoadCompanyInfoAsync(Guid session)
{
  var client = new QualerServiceClient("QualerService");
  return client.GetCompanyInfoAsync(session);
}

public async void ButtonClickOrWhatever(...)
{
  var company = await LoadCompanyInfoAsync(mySession);
  // Update UI with company info.
}

旧的Begin/End方法对使用的是异步编程模型 (APM)。旧的Async/event对使用基于事件的异步编程模型 (EAP)。新Async方法使用基于任务的异步编程模型 (TAP)。我的博客上有更多关于asyncWCF的信息。

于 2012-08-23T16:56:17.327 回答
0

您可以将异步 CTP 用于 .net 4,它将在 5 中成为 .net 的一部分。

它在 C# 中添加了两个新关键字 async 和 await 关键字。
您使用 async 关键字标记方法或 lamda 并返回一个 TaskTask<T>

当你调用你的方法时,你会这样称呼它

var result = await LoadCompanyInfo(sessionId);

异步 CTP

    public static async Task<Company> LoadCompanyInfo(Guid session)
    {
      Company result = default(Company);
      await TaskEx.Run(()=>{
      var client = new QualerServiceClient("QualerService");
      result = client.GetCompanyInfo(session);
      });

     return result;
    }
于 2012-08-23T16:16:28.727 回答
0

Use TPL:

Task t = TaskFactory.FromAsync(
             beginMethod: BeginGetCompanyInfo,
             endMethod: EndGetCompanyInfo,
             arg1: session,
             state: null);
t.ContinueWith(result =>
    {
        // handle result
    });
于 2012-08-23T16:26:43.573 回答