Windows CE デバイスと PC の間で使用する Web サービス インターフェイスを設計しています。Windows CE デバイスがサーバーで、PC がクライアントです。
gSOAPライブラリを使用してサーバーを実装することに決め、クライアントには .NET/C# を使用しています。ここで説明されているアプローチに従っていますが、すべてがうまく機能しています。
私の質問は、サーバーからクライアントへの非同期コールバック/イベントを最適に実装する方法についてです。私は2つの方法を考えることができます:
- アクティブなイベントについてサーバーを継続的にポーリングする
- イベントが発生するまで接続を開いたままにするブロッキング方式
現在、オプション 2 を選択していますが、うまく機能しているようです。クライアントで非同期メソッドを使用しているため、メソッドが完了したとき、つまり Windows CE デバイスでイベントが発生したときにコールバックを受け取ります。次に、すぐに同じメソッドをもう一度呼び出して、次のイベントの準備を整えます。
サーバーメソッドの例 (エラー処理なし):
int ns__WaitForEvent(struct soap* soap, int *eventId)
{
WaitForSingleObject(hMyServerEvent, INFINITE);
*eventId = GetCurrentEventId();
return SOAP_OK;
}
クライアントの例 (エラー処理なし):
private void SubscribeToServerEvents()
{
var server = new MyMethods.ServicePortTypeClient(
new BasicHttpBinding(),
new EndpointAddress(myIpAddress));
AsyncCallback cb = this.Callback;
server.BeginWaitForEvent(cb, server);
}
private void Callback(IAsyncResult ar)
{
var server = (MyMethods.ServicePortType)ar.AsyncState;
var result = server.EndWaitForEvent(ar);
// Do stuff with result
}
このアプローチを機能させるには、サーバーをマルチスレッド化する必要があります。また、クライアントの数を制限して、サーバーがブロッキング メソッドで多数のスレッドをハングさせないようにする必要があります。私の場合、これらの問題はどれも問題ではありません.gSOAPを使用してマルチスレッドサーバーをセットアップするのは簡単で、各サーバーに接続されるクライアント(私が制御する)は1つだけです.
このアプローチに重大な欠点はありますか? より良い解決策を提案できますか?