4

当社は、GUIアプリケーション用のネットワークコンポーネント(DLL)を提供しています。

切断をチェックするタイマーを使用します。再接続する場合は、次の呼び出しを行います。

internal void timClock_TimerCallback(object state)
{
  lock (someLock)
  {
    // ...
    try
    {
         DoConnect();
    }
    catch (Exception e)
    {
        // Log e.Message omitted
        // Raise event with e as parameter
        ErrorEvent(this, new ErrorEventArgs(e));
        DoDisconnect();
    }
    // ...
  }
}

したがって、問題は、DoConnect()ルーチン内で、SocketExceptionがスローされる(キャッチされない)ことです。キャッチ(例外e)はすべての例外をキャッチするはずですが、どういうわけかSocketExceptionがキャッチされず、GUIアプリケーションに表示されると思います。

protected void DoConnect()
{
    //
    client = new TcpClient();
    client.NoDelay = true;
    // In the following call the SocketException is thrown
    client.Connect(endPoint.Address.ToString(), endPoint.Port);
    // ... (login stuff)
}

ドキュメントは、SocketExceptionがExceptionを拡張することを確認しました。表示されたスタックトレースは次のとおりです。

TcpClient.Connect() -> DoConnect() -> timClock_TimerCallback

したがって、例外はtry/catchブロックの外ではスローされません。

それが機能しない理由はありますか?

4

4 に答える 4

1

ErrorEvent(コメントごとに)本当に別の例外が発生した場合、DoDisconnect()実行されることはありません。

そうしないと、表示される例外が発生する可能性がありますDoDisconnect()

于 2010-02-08T15:36:52.360 に答える
0

私は小さなプログラムを書きましたが、再現できませんでした.SocketExceptionがTimerCallback内で問題なくキャッチされました。

したがって、分析を再考することをお勧めします。問題は、あなたが考えているものではない可能性があります。いくつかの提案:

  • タイマーの外で実行します。これにより、スレッドがループから外されます。
  • デバッガーで実行します。例外は実際にどこで発生しますか?
  • 例外処理をステップ実行します。ErrorEvent は何をすべきか?
于 2010-02-08T19:01:25.047 に答える
0

DoConnect() コードを投稿していただけますか?

また、試してみること: DoConnect() でキャッチできますか? 一般的な例外だけでなく、特定の例外をキャッチしてみてください。デバッグモードを使用すると、どのように反応しますか?

于 2010-02-08T15:37:48.577 に答える
0

あなたtimClock_TimerCallbackは、キャッチステートメントが例外をキャッチしたいのと同じスレッドで呼び出されません。内部timClock_TimerCallbackで例外をキャッチし、それ自体を呼び出すメソッドを呼び出してから、適切なスレッドで例外を再スローする必要があります。

これが機能するかどうかはわかりませんが、試してみてください。

于 2010-02-08T15:49:34.660 に答える