2

WCF サービスに接続する MEF/Prism を使用する Silverlight クライアントがあります。アプリケーション全体で共有サービスとして使用する「サービス エージェント」を作成しています。この "サービス エージェント" は、クライアントが WCF サービスを呼び出す唯一の方法を提供するシングルトンです。私はサービス コントラクトを実装しました。すべてのメソッドは非常によく似ていますが、呼び出す特定の Begin/End 操作とそれらが受け入れる引数を除きます。

例えば:

public void WakeUpInstanceAsync(Foo opportunity, bool isHistorical, Action<WakeupObj> callback)
{
    if (IsOpen())
    {
        AsyncCallback asyncCallback = (e) =>
        {
            _currentDispatcher.BeginInvoke(() =>
            {
                try
                {
                    callback(_funnelClient.EndWakeUpInstance(e));
                }
                catch (CommunicationException ex1)
                {
                    // Notify someone via eventaggregator?
                    callback(null);
                }
            });
        };

        _funnelClient.BeginWakeUpInstance(opportunity, isHistorical, asyncCallback, null);
    }
}

2 つのパラメーター (「begin」メソッドと「end」メソッド) を取るジェネリック メソッドを作成する方法はありますか?

4

3 に答える 3

2

このようなものがあなたが探しているものでしょうか?

    public void WakeUpInstanceAsync(Foo opportunity, bool isHistorical, Action<WakeupObj> callback)
    {
        this.ImplementAsyncMethod(
            asyncCallback => _funnelClient.BeginWakeUpInstance(opportunity, isHistorical, asyncCallback, null),
            asyncResult => _funnelClient.EndWakeUpInstance(asyncResult),
            callback);
    }

    public void ImplementAsyncMethod<T>(Action<AsyncCallback> begin, Func<IAsyncResult, T> end, Action<T> callback)
    {
        if (IsOpen())
        {
            AsyncCallback asyncCallback = (e) =>
            {
                _currentDispatcher.BeginInvoke(() =>
                {
                    try
                    {
                        callback(end(e));
                    }
                    catch (CommunicationException ex1)
                    {
                        // Notify someone via eventaggregator?
                        callback(default(T));
                    }
                });
            };

            begin(asyncCallback);
        }
    }

(免責事項 - 私はそれをコンパイルしていません)

于 2012-10-05T20:42:07.170 に答える
1

TaskFactory.FromAsyncを使用して、ほぼすべてのBegin/End非同期メソッドのペアをTask<T>. これにより、「コールバック」の UI スレッドで継続を使用できるため、非同期プログラミングを操作するためのよりクリーンなモデルが提供されます。

于 2012-10-05T20:21:47.380 に答える
0

複数のパラメーターを保持するには WakeUpInstanceResult クラスが必要なようです。

于 2012-10-05T20:20:09.190 に答える