現在、受信データのシリアル ポートを監視し、データを処理し、受信したデータに基づいてデリゲート/イベントを介してイベントを発生させる 1 つのクラスがあります。これはスタンドアロン アプリケーションです。Windows が起動し、クライアント アプリケーションがリモート PC またはローカル マシンからのイベントをサブスクライブするときに、シリアル ポート モニター クラスがサービスとして開始されるように、これをサービスに変換する必要があります。この種のアプリケーションでの WCF の使用に関する多くの記事を見てきました。ただし、WCF はメッセージ ベースであり、クライアントが要求されたときにサービス オブジェクトを作成します。しかし、私の要件は、サービスが自動的に開始され、クライアント アプリケーションが、起動時に既に作成されているサービス クラス インスタンスのイベントをサブスクライブできることです。WCF を使用してこれを達成するにはどうすればよいですか?
質問する
393 次
1 に答える
1
WCFのデフォルトの動作では、サービスクラスの新しいインスタンスを作成して、各着信要求を処理しますが、クラスを次のように装飾することで、これをオーバーライドできます。
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
ただし、シングルトンで良好なパフォーマンスを得るには、考慮する必要のあることがいくつかあります。
- シングルトンインスタンスの構成を行う必要がある可能性が高いため
ServiceHost
、シングルトンインスタンスを引数として取るコンストラクターメソッドを使用することをお勧めします。(例については、この記事の図8シングルトンの初期化とホスティングを参照してください。 - スレッド化:デフォルトのスレッド化モデル(
ConcurrencyMode
)では、一度に1つのスレッドのみがシングルトンインスタンスにアクセスできます。良好なパフォーマンスを得るには、の使用を検討する必要がある場合がありConcurrencyMode = ConcurrencyMode.Multiple
ます(つまり、スレッド関連の問題を自分で処理する必要があります)。 - コールバックコントラクトのメソッドがマークされていることを確認して、
[OperationContract(IsOneWay = true)]
イベントをサブスクライバーに公開し直しても、イベントハンドラーが完了するまでサービスインスタンスがブロックされないようにします。(このようにWCFを使用する方法については、JuvalLowyによるこの記事で詳しく説明しています。
于 2012-05-14T12:26:50.450 に答える