【问题标题】:How to get data (asynchronously) from WCF?如何从 WCF 获取数据(异步)?
【发布时间】:2012-08-23 15:13:08
【问题描述】:

我得到了使用 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 不死机?

【问题讨论】:

  • 我们不知道 QualerServiceClient 来自哪里...
  • 这有关系吗?我想知道,如何从回调和列表中的其他一些问题中获取数据。
  • 它在哪里有点重要,因为您正在调用它的一个函数。如果你想了解 AsycnCallbacks:stackoverflow.com/questions/1047662/what-is-asynccallback 在 WPF 中异步执行代码的最佳实践通常是使用后台工作线程。
  • 一般来说,问题应该限制在一个单一的、包含的问题上,该问题有一个或多个单一的、包含对一个相同问题的答案。 =)

标签: c# .net wcf asynchronous


【解决方案1】:

我假设您使用的是 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.0
  • 答案并不是说你不应该使用 4.0。
【解决方案2】:

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

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

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

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

【讨论】:

  • thans,但我使用的是没有异步 CTP 的 .net 4.0
【解决方案3】:

使用TPL:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多