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

  • GetCompanyInfoAsync

およびイベント:

  • GetCompanyInfoCompleted.

質問:

  1. コールバック メソッドからデータを取得するにはどうすればよいですか?

  2. GetCompanyInfoAsyncとはどう違いBegin\Endますか?

  3. ベスト プラクティス: WPF アプリの GUI がフリーズしないように、メソッドを非同期で実行するにはどうすればよいですか?

4

3 に答える 3

3

VS2012を使用していると仮定しています。

まず、ターゲットが .NET 4.0 の場合は、Async Targeting パックを (NuGet 経由で) インストールします。ターゲットが .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

TPLを使用する:

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

.net 4の非同期CTPを使用できます。これは、5で.netの一部になります。

2つの新しいキーワードをC#asyncおよびawaitキーワードに追加します。
メソッドまたはラムダをasyncキーワードでマークし、 Taskまたはを返しますTask<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 に答える