繁体   English   中英

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

[英]How to get data (asynchronously) from WCF?

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

规则

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

  2. GetCompanyInfoAsyncBegin\\End什么区别?

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

我假设你正在使用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的更多信息。

您可以使用.net 4的异步CTP,它将成为.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;
    }

使用TPL

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM