4

最近、バックグラウンドワーカーを使用していくつかの操作を行い(他のWebサービスからデータを取得)、イベントを使用してデータをクライアントにスローするプロジェクトを見てきました。このプロジェクトはWCFサービスであり、ASP.NET Webサイトによって、別のクラスライブラリによってWCFクライアントの役割として使用され、アプリケーションにイベントがスローされます。このすべてのマルチスレッドシリーズは、私が調べたいと思った。これはbasicHttpBinding拘束力があることを確認しました。サービスに対する唯一の動作は、UseSynchronizationContext=false説明のつかない例外の後に追加されたことがわかった場所です。これは正常です:)

今、私はのデフォルトConcurrencyModeについて尋ねていますbasicHttpBinding。彼らはそれを成し遂げるべきではありませんか、Reentrantそれともこれがデフォルトの振る舞いです?

WCFサービスがクライアントからダウンしている場合、オブジェクトのインスタンスに設定されていない説明のつかない参照がすでにあるため、このシナリオは失敗し続けますか?IIS処理に依存するASP.NETプロジェクトによって消費されるWCFサービスでマルチスレッド操作を使用することは悪いことだと思います。これは、WCFサービスがクライアントクラスライブラリにデータを返し、これらをページに追加する前に、ページがクライアントに送信される可能性があるためです。上記について話し合い、あなたの考えを説明していただけますか?

CallbackContractsマルチスレッド操作ではなく、組み込みWCFテクノロジを使用した長時間の操作の後に通知するように、WCF消費者に通知するために、このような非同期プログラミングスタイルが必要な場合は、より良い方法ではありませんか?

設計を修正するための説明が必要であり、これが実際のサービスアーキテクチャである場合、これが悪いサービスアーキテクチャであることを証明するものがあります。

ありがとうございました。

4

1 に答える 1

2

それは本質的に悪いアーキテクチャではありませんが、多くの落とし穴が生じる可能性があるように思えます。

WCF クライアント ライブラリは、すべての調整を ASP.NET アプリケーションに任せています。ASP.NET アプリが WCF サービスへの呼び出しが完了したことを確認していない場合、何らかの調整方法を明示的に設定しない限り、サービスからの値が設定される前に変数を使用するリスクや、その他の競合状態が発生するリスクがあります。完了イベントに対する最初の呼び出し。

名前空間Taskからオブジェクトを返すように WCF クライアントの非同期メソッドを書き直すことをお勧めします ( MSDN リファレンス)。このようにして、WCF サービスを呼び出すバックグラウンド処理をスピンオフし、 のプロパティを使用してサービスが完了したことを確認できます。System.Threading.TasksResultTask

例:

protected void Page_Load(object sender, EventArgs e)
{
    Task<string> t = Task<string>.Factory.StartNew(() =>
    {
        return MyWcfClientClass.StaticAsyncMethod(MyArguments);
    }

    /* other control initialization stuff here, while the task 
       and WCF call continue processing in background */

    /* Calling Result causes the thread to wait for the task to 
       complete as necessary, to ensure we have our correct value */
    MyLabel1.Text = t.Result;
}
于 2012-05-02T20:38:39.773 に答える