2012-02-16 18 views
3

私はSocketAsyncEventArgsを使用して、何百もの機器と通信しています(そのほとんどはGPRS経由)。場合によっては、タイムアウトオプション(つまり、SocketOptionName.SendTimeout)が非同期通信で動作しないと書類に記載されているため、その一部が応答を停止し、操作をタイムアウトする方法がないようです。SocketAsyncEventArgsとの非同期ソケット通信のタイムアウト

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

これに関するアドバイスはありますか?

+0

どのトランスポートプロトコルを使用していますか?おそらく、あなたの問題を既に解決している[UDPClient](http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.aspx)やTCPクラスのようなラッパークラスがありますか? – HaMster

答えて

2

はここに(私は解決策を好きではなかったaltough)私はそれをやった方法は次のとおりです。

アイデアは焼成したとき、タイムアウトのためにすべての保留中の操作を確認し、1つのタイマーを持つことです。 私は非同期クライアントを実装インターフェイスを作成しました:

操作は、次のように定義列挙型、ある
public interface ITimeoutable { 
    event Action<ITimeoutable, Operation> Begin; 
    event Action<ITimeoutable, Operation> End; 
    void DoTimeout(Operation operation); 
} 

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

、クライアントは非同期操作を開始するときBeginイベントを発生させ、発生させますEndイベントが終了しました。一方、私はTimeoutManagerを作成しました。TimeoutManagerには、非同期クライアントのコレクションと、操作を含む辞書と、開始された瞬間があります。新しいクライアントが作成されると、そのクライアントはイベントにサブスクライブするTimeoutManagerに登録されます。 TimeoutManagerは、System.Threading.Timerを使用して、どの操作がタイムアウトしたかを確認します。タイムアウトが発生した場合は、DoTimeoutメソッド(ITimeoutableインターフェイスから)を呼び出します。

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

関連する問題