0

WCF サービスを利用する Silverlight 5 アプリがあります。生成されたプロキシ クライアントには非同期メソッドしかありません (デフォルトでは、SL クライアントから生成する場合)。

VS2012RC 内にあるタスク ベースの非同期パターン (TAP) を利用したいと考えています。

生成されたクライアント プロキシから非同期メソッドを使用する最善の方法は何ですか?

(問題は、WCF プロキシ ジェネレーターが、TAP ではなく、イベント ベースの非同期パターン (EAP) に基づくコードを作成することです....)

4

2 に答える 2

2

このドキュメントに基づく: http://www.microsoft.com/en-us/download/details.aspx?id=19957

これに対する解決策を見つけました。

以下のコードを参照してください。

public class MyDataListProvider : IMyDataListProvider
{
    private <ObservableCollection<IMyData>> myDataList;

    public Task<ObservableCollection<IMyData>> GetMyData()
            {
                TaskCompletionSource<ObservableCollection<IMyData>> taskCompletionSource = new TaskCompletionSource<ObservableCollection<IMyData>>();

                MyWCFClientProxy client = new MyWCFClientProxy();

                this.myDataList.Clear();

                client.GetMyDataCompleted += (o, e) =>
                {
                    if (e.Error != null)
                    {
                        taskCompletionSource.TrySetException(e.Error);
                    }
                    else
                    {
                        if (e.Cancelled)
                        {
                            taskCompletionSource.TrySetCanceled();
                        }
                        else
                        {
                            foreach (var s in e.Result)
                            {
                                var item = new MyData();
                                item.Name = s.Name;
                                item.Fullname = s.Fullname;

                                this.myDataList.Add(item);
                            }

                            taskCompletionSource.TrySetResult(this.myDataList);
                        }
                    }
                };

                client.GetMyDataAsync();

                return taskCompletionSource.Task;
            }
}

クライアント SL コード:

private async void SetMyDataList()
        {
            this.MyDataList = await this.myDataListProvider.GetMyData();
}
于 2012-07-12T10:53:40.397 に答える
0

RC で利用可能かどうかはわかりませんが、SDK 8.0A (VS2012 に含まれているもの)svcutil.exeでは、TAP パターンを使用して非同期メソッドを生成します。

デフォルトでTAPを使用するため、メソッドを生成する古いAPMメソッドにフォールバックするため、必ず含めないでください。/async

のバージョンが TAP を使用するのに十分なほど新しいかどうかはsvcutil、ツールの少なくともバージョン 4.0 であることが含まれるプログラムの最初の行を調べることで確認できます。

Microsoft (R) Service Model Metadata Tool [Microsoft (R) Windows (R)
Communication Foundation、バージョン4.0 .xxxxx.xxxxxx]

于 2013-02-09T21:46:40.397 に答える