0

私のアプリケーションでは、ソケット受信操作をブロックするポーリング ループが必要ですが、100 ミリ秒後にタイムアウトします。これにより、ビジー ループや Thread.sleep の使用を避けながら、必要なときに (ユーザーが UI で何かをクリックしたなど) ループを終了できます。

ただし、一度 .NET ソケットが開かれると、タイムアウトになるのは 1 回だけのようです。最初のタイムアウトの後、ブロックされるすべての呼び出しはすぐに例外をスローします。

この質問によると、「非同期操作をタイムアウトまたはキャンセルすることはできませんSocket。」なぜだめですか?.NET の世界で問題に取り組むためのより良い方法はありますか?

4

1 に答える 1

0

.NET ソケットで非ビジー ポーリング ループを作成するには、次のように Poll ソケット メソッドを使用できます。

for (keepGoing) {
    if (mySocket.Poll(1000 * timeout_milliseconds, SelectMode.SelectRead)) {
        // Assert: mySocket.Available > 0.
        // TODO: Call mySocket.Receive or a related method
    }
}

この場合、Poll指定されたタイムアウト内にソケットから読み取れるデータがない場合は false を返します。keepGoingポーリング ループを完全にシャットダウンする場合は、別のスレッドを false にリセットできます。

于 2012-05-15T14:08:53.080 に答える