0

WCF サービスを非同期で呼び出しています。

public partial class ServiceClient : System.ServiceModel.ClientBase<MyService>, MyService 
{
    ......
}

ServiceClient _serviceclient;
void Getproducts(string filter, string augument, EventHandler<GetCompletedEventArgs> callback)
{
    _serviceclient.GetAsyncGetproducts(filter, argument, callback);
}

Getproducts 関数を同期させたい。次のようにこれを達成する最良の方法は何ですか

void Getproducts(string filter, string augument, EventHandler<GetCompletedEventArgs> callback)
{
    _serviceclient.GetAsyncGetproducts(filter, argument, callback);
    //wait until callback comes back and return
}

編集:プロキシは同期呼び出しを提供しています

4

2 に答える 2

2

UI スレッドからSilverlight で同期ネットワーク要求を行うことはできません。それを回避することはありません。非同期メソッドをだまして同期的に動作させようとしても、うまくいきません。それが可能であれば、UI スレッドがブロックされ、アプリケーションがフリーズしたように見えるためです。これは、SL でのネットワーク リクエストへの応答が常に UI スレッドに配信されるために発生します。UI スレッド自体で待機すると、デッドロックが発生します。

基本的に 2 つのオプションがあります。優先されるのは、実際に非同期ルートを使用することです。同期プログラミングにしか慣れていない場合、最初は難しいかもしれませんが、非常に価値のあるスキルです。もう 1 つのオプションは、バックグラウンド スレッドで呼び出しを行うことです。私はそれを試してみましたが、うまくいきました。ブログに書いている人もいるので、試してみることもできます。しかし、公式にはサポートされていません。

于 2013-02-04T22:37:46.757 に答える
1

コールバック パラメータをコールバックとして渡すだけでなく、他の処理に加えてそのメソッドを実行する独自のコールバックを割り当てる必要があります。事実上、何らかのイベントをトリガーするだけで済みます。タスクを使用した 1 つの方法を説明しましたが、自動リセット イベントやその他の同期方法のいずれかを簡単に使用することもできます。

void Getproducts(string filter, string augument, EventHandler<GetCompletedEventArgs> callback)
{
    var tcs = new TaskCompletionSource<bool>();
    _serviceclient.GetAsyncGetproducts(filter, argument, args =>
    {
        callback(args);
        tcs.SetResult(true);
    });

    tcs.Task.Wait();
}
于 2013-02-04T15:01:33.347 に答える