C#で記述されたライブラリを使用するC ++/CLIで記述されたアプリケーションがあります。このアプリケーションは、標準のソケットAPIを使用して作成され、select()を使用して通常の非同期ソケットの束を多重化します。ただし、サードパーティのライブラリは.NETソケットを使用し、非同期の結果とコールバックを使用します。
シナリオは次のとおりです。メインスレッド(主にネイティブスタイルのコードを使用するC ++ / CLIアプリケーション)に一連の通常のソケットを作成します。サードパーティのライブラリベンダーのC#「セッション」オブジェクトを作成します。このオブジェクトには、内部で.NETクラスの非同期ソケットが多数含まれています。
私が気付いたのは、C#の「セッション」オブジェクトをインスタンス化するメインスレッドのselect()にNULLタイムアウトパラメーターを設定すると、.NETソケットに対して非同期コールバックがまったく行われないことです。たとえば1秒のタイムアウトを使用し、非同期ソケットで他のアクティビティが発生しない場合、select()がタイムアウトするまで非同期ソケットコールバックは配信されません。
どういうわけか、select()は.NETソケットに対してコールバックが発生するのを防いでいます。これを回避するにはどうすればよいですか?.NETソケットが非同期コールバックを配信できるようにする古いソケットに使用できる代替のポーリング方法はありますか?