0

私は自分のプロジェクトにVS2012を使用しています。サーバーがターゲットマシンにメッセージを送信できない場合にソケット例外を処理していますが、メッセージを送信できない場合に発生します(すでにtrycatchに入れています)デバッガーはcatchブロックで中断し、送信せずにエラーを言います親キャッチ ブロックに転送します。私が何か間違ったことをした場合は、教えてください。

    private void sendMessageToTarget(string Message, IPAddress targetAddress, int port)
    {
        TcpClient client = new TcpClient();
        IPEndPoint server = new IPEndPoint(targetAddress, OUT_MESSAGE_PORT);
        Thread senderThread = new Thread(new ThreadStart(delegate()
        {
            try
            {
                client.Connect(server);
                MemoryStream memstream = new MemoryStream();
                NetworkStream netstream = client.GetStream();
                byte[] sentString = Encoding.ASCII.GetBytes(Message);
                netstream.Write(sentString, 0, sentString.Length);
                memstream.Close();
                netstream.Close();
                client.Close();
            }
            catch (SocketException ex)
            {
                throw;
            }
        }));
        senderThread.Start();
    } // Sending Message Method

上記は、ターゲットにメッセージを送信するための私のコードです

try
{
      sendMessageToTarget("CONN_CHECKER", target, OUT_MESSAGE_PORT);
}
catch (Exception se)
{
      ConnectedUsers.Remove(target.ToString());
      UpdateConnectedUserToTeacher();
      if (NeedFollowStudents.Contains(target.ToString()))
      {
          NeedFollowStudents.Remove(target.ToString());
      }
      UserLostConnection(this, new EventArgs());
}

そして、これはアクションを実行したい別の関数のメソッドです。

4

2 に答える 2

1

あるスレッドから別のスレッドへの魔法のマーシャリング例外はありません。スレッドのデリゲート内のコードの前に、後のコードが実行されることはほぼ保証されています。senderThread.Start();

コンストラクターに渡すThread関数は、新しいスレッドのトップレベル関数になります。そのような関数が(あなたのように)例外をスローした場合、この例外はAppDomain.UnhandledExceptionイベントに移動し、通常はアプリケーションを終了します。

あなたのオプション

  • 同期コードに戻す (すべてのコードを 1 つのスレッドに)
  • 操作の終了をコードに通知する既存の非同期メソッドを使用します。アプローチに応じて、通知はイベント経由 ( WebClient.DownloadStringAsyncと同様) またはコールバック経由で Socket.BeginSend のように EndXXXXX を呼び出すことができます。
  • 使用するasync
  • 元のスレッドに手動で同期とマーシャリングの例外を実装します。

コードの同期バージョンのみが希望どおりに機能することに注意してください。複数のスレッドを使用する他のすべてのスレッドは、同じ「親関数」に例外を返すことができません (を使用asyncすると、少なくとも、同じようには機能しません)。

于 2013-03-03T03:19:34.327 に答える
0

これは単なる推測ですが、Try / Catchは親関数にのみ配置し、子には配置しないでください。例外が発生すると、親メソッドに表示されます。あなたがそれを書いた方法は、子メソッドの例外をキャッチし、それはあなたの親メソッドに戻されません。

于 2013-03-03T03:04:46.150 に答える