web-dev-qa-db-ja.com

複数のプロキシおよびマルチスレッドコールバックを持つクライアント

WCFを使用してセッションフルWebサービスを作成しました。特に、NetTcpBindingバインディングを使用しました。セッションを開始および終了するメソッドに加えて、他のメソッドでは、クライアントが実行する1つ以上のタスクに送信できます(結果はコールバックを介して返されるため、サービスは二重です)が、ステータスを知ることもできます。サービスの。

複数のエンドポイントで同じサービスをアクティブ化し、クライアントがこれらのエンドポイントを知っていると仮定すると(たとえば、エンドポイントのListを維持できる場合)、クライアントは同じサービスの1つ以上のレプリカに接続する必要があります。クライアントはサービスのステータスを定期的に更新するため、新しいタスクを実行する必要がある場合(タスクはUIを介してユーザーによって送信されます)、現在負荷が少ないサービスを選択してタスクを送信します。定期的に、クライアントは、1つ以上の過負荷サービスから切断し、新しいサービスに接続するために、メンテナンス手順も開始します。

svcutilツールを使用してクライアントプロキシを作成しました。各プロキシを異なるスレッドで同時に使用できるようにしたいと思います。たとえば、プロキシを使用してタスクを送信するスレッドに加えて、定期的に動作する次の2つのスレッドもあります。

  • 更新された状態を取得するために定期的にサービスにリクエストを送信するスレッド。
  • 閉じるプロキシを定期的に選択し、閉じたプロキシを置き換えるために新しいプロキシをインスタンス化するスレッド。

これらの目的を達成するには、プロキシの配列を作成し、それらの開閉を別々のスレッドで管理することで十分ですか?プロキシメソッドの呼び出しはスレッドセーフであると読んだので、サービスの更新を要求する前にロックを実行する必要はないと思います。ただし、メンテナンス手順(独自のスレッドでアクティブ化される)がプロキシを閉じることを決定した場合、ロックを実行する必要がありますか?

最後に、各プロキシは、サービスのコールバックインターフェイスを実装するオブジェクトにも関連付けられています。コールバック(クライアントで呼び出される)は、クライアントの異なるスレッドで実行されますか?

プロキシの管理を1つ以上のクラスにラップして、WPFアプリケーション内で簡単に管理できるようにしたいと思います。

3
enzom83

このプロキシの管理に使用できるSingleTonクラスを作成しました。

/// <summary>
/// Singleton Pattern
/// <para>ConnectionHelper provides connection to the Server.</para>
/// </summary>
public sealed class ConnectionHelper
{
    private static readonly ConnectionHelper instance = new ConnectionHelper();
    /// <summary>
    /// Provides a readonly Instance to "ConnectionHelper" class.
    /// </summary>
    public static ConnectionHelper Instance
    {
        get
        {
            return instance;
        }
    }
    /// <summary>
    /// Provides access to IServer members.
    /// </summary>
    public ServerProxy ServerProxyInstance { get; set; }

    /// <summary>
    /// Gets or sets the peer vue communication URL.
    /// </summary>
    /// <value>The peer vue communication URL.</value>
    public string CommunicationURL
    {
        get;
        set;
    }

    .....
    ...
    ..
}
1
Sreekumar P