4

私は SocketAsyncEventArgs を使用して、何百もの機器 (ほとんどは GPRS 経由) と通信しています。ドキュメントには、タイムアウト オプション (つまりSocketOptionName.SendTimeout ) が非同期通信では機能しないと記載されているため、応答を停止するものもあり、操作をタイムアウトにする方法がないようです。

Send/Receive/ConnectAsync の実行時にタイムアウトをチェックする方法を探しています。スレッドをブロックしてはいけません (したがって、someMonitor.WaitOne(SomeTimeoutValue) を呼び出しても実行されません)。また、操作ごとにタイマー インスタンスを作成したくありません (機器の数が確実に増加するため)。

これに関するヒントはありますか?

4

1 に答える 1

2

これが私がやった方法です(解決策は好きではありませんでしたが):

アイデアは、起動時にすべての保留中の操作のタイムアウトをチェックする 1 つのタイマーを用意することです。非同期クライアントが実装するインターフェイスを作成しました。

public interface ITimeoutable {
    event Action<ITimeoutable, Operation> Begin;
    event Action<ITimeoutable, Operation> End;
    void DoTimeout(Operation operation);
}

ここで、Operation は次のように定義された列挙型です。

public enum Operation {
    Connect,
    Send,
    Receive,
    Disconnect
}

そのため、クライアントはBegin非同期操作の開始時にイベントを発生させ、完了時にEndイベントを発生させます。反対側では、TimeoutManager を作成しました。これには、非同期クライアントのコレクションと、操作とそれらが開始された瞬間を含むディクショナリがあります。新しいクライアントが作成されるTimeoutManagerと、イベントにサブスクライブする に登録されます。は、をTimeoutManager使用して、System.Threading.Timerタイムアウトになった操作を確認します。タイムアウトがある場合は、 (インターフェースDoTimeoutから) メソッドを呼び出します。ITimeoutable

これはかなり複雑なコードで、私は好きではありません。しかし、それは機能します。

于 2012-02-17T16:53:31.063 に答える