1

私が取り組んでいるプロジェクトは、すべてのサービスが WCF で記述され、クライアントが WPF で記述されたクライアント サーバー アプリケーションです。サーバーが情報をクライアントにプッシュする必要がある場合があります。最初は WCF Duplex Services の使用について考えていましたが、オンラインで調査した結果、多くの人がさまざまな理由で使用を避けていることがわかりました。

次に考えたのは、クライアントにホスト接続を作成させて、サーバーがそれを使用してクライアントへのサービス呼び出しを行えるようにすることでした。ただし、問題は、アプリケーションがインターネット経由で展開されることです。そのため、このアプローチでは、着信トラフィックを許可するようにファイアウォールを構成する必要があり、ほとんどのユーザーは通常のユーザーであるため、ポート転送を許可するようにルーターを構成することも必要になる場合があります。ユーザーにとっては面倒。

GetNotifications()私の 3 番目のオプションは、クライアントで、サーバー上のメソッドを呼び出すバックグラウンド スレッドを生成することです。サーバー側のこのメソッドは、実際の通知が作成されるまでブロックし、スレッドに通知され (AutoResetEventおそらくオブジェクトを使用して?)、情報がクライアントに送信されます。アイデアは次のようなものです。

クライアント

private void InitializeListener()
{
    Task.Factory.StartNew(() =>
    {
        while (true)
        {
            var notification = server.GetNotifications();

            // Display the notification.
        }
    }, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}

サーバ

public NotificationObject GetNotifications()
{
    while (true)
    {
         notificationEvent.WaitOne();
         return someNotificationObject;
    }
}

private void NotificationCreated()
{
    // Inform the client of this event.
    notificationEvent.Set();
}

この場合、NotificationCreated()は、サーバーがクライアントに情報を送信する必要があるときに呼び出されるコールバック メソッドです。

このアプローチについてどう思いますか?これはスケーラブルですか?

4

1 に答える 1

1

クライアントごとに、サーバー上でスレッドを保持します。数百のクライアントがあり、サーバーがとにかくメモリを使用しない場合は、それで問題ない可能性があります。より多くのクライアントが存在する可能性がある場合、またはクライアントごとに 1MB のスタックを焼きたくない場合は、いくつかの変更を行う必要があります。

  1. 非同期 WCF アクション メソッドを使用します。メソッドが待機している間、リクエスト スレッドのブロックを解除できます。
  2. イベント モデルを一度非同期に変更します。SemaphoreSlim非同期サポートがあります。も使用できますTaskCompletionSource

そうすれば、多くの接続にスケールアップできます。

于 2013-10-18T21:57:02.510 に答える