如何从WCF获取数据(异步)?

时间:2012-08-23 15:13:08

标签: c# .net wcf asynchronous

我有使用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

  • GetCompanyInfoAsync

和事件:

  • GetCompanyInfoCompleted。

Quastions

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

  2. GetCompanyInfoAsyncBegin\End之间有什么区别?

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

3 个答案:

答案 0 :(得分:3)

我假设你正在使用VS2012。

首先,如果您的目标是.NET 4.0,则安装(通过NuGet)Async Targeting包。如果您的目标是.NET 4.5,则无需执行任何特殊操作。

接下来,重新创建您的客户端代理。现有的Begin / End / Async个端点将替换为单个Task<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)。我在我的博客上有关于async WCF的更多信息。

答案 1 :(得分:0)

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

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

当你打电话给你的方法时,你会这样称呼它

var result = await LoadCompanyInfo(sessionId);

Async 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;
    }

答案 2 :(得分:0)

使用TPL

Task t = TaskFactory.FromAsync(
             beginMethod: BeginGetCompanyInfo,
             endMethod: EndGetCompanyInfo,
             arg1: session,
             state: null);
t.ContinueWith(result =>
    {
        // handle result
    });