次のコードがあります。2秒以内にスレッドが終了しない場合はスレッドを中止します。最初のコードから、whileループで新しいmyThread evertyimeを作成し、それを中止しないことがわかります。まあ、私はそれをこのようにしたくありませんが、myThreadをループの外に出して、2番目のコードのようにabort()関数を使用する場合。中止するとエラーが発生します。
while (true)
{
try
{
m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//reset up socket
myThread = new System.Threading.Thread(new System.Threading.ThreadStart(socket_connect));
myThread.Start();
if (!myThread.Join(2000))
{
throw new SocketException(SocketError.AccessDenied);
}
}
catch (Exception ex)
{
m_socket.Close();
}
}
}
private static void socket_connect()
{
m_socket.Connect(remoteEndPoint);//Connect to remote device
}
私は最初に次のコードを試していましたが、threadabortexceptionsが発生します。
myThread = new System.Threading.Thread(new System.Threading.ThreadStart(socket_connect));
while (true)
{ try
{
m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//reset up socket
myThread.Start();
if (!myThread.Join(2000))
{
myThread.Abort();
throw new SocketException(SocketError.AccessDenied);
}
}
catch (Exception ex)
{
m_socket.Close();
}
}
}
private static void socket_connect()
{
m_socket.Connect(remoteEndPoint);//Connect to remote device
}
abort()は良い考えではないことを知っているので、スレッドをそのままにして、C#(。Net?実際に誰がそれを行うのかわかりません)にガベージコレクションを処理させます。そして、このプログラムはスレッドの束を保持するためのメモリがあまりないボード上で実行されるので、誰でもそれが良い考えであるかどうかを知ることができます。そして、誰かがC#でガベージコレクションがどのように正確に行われるか教えてもらえますか?たとえば、スレッド。
もう1つ言及する必要があるのは、Taskクラスまたはsocket.beginconnect()メソッドがないことです。これは、PCではなく小さなボードで実行されるプログラムを作成しているためだと思います。ボードはnetduidoplusであり、netduinoplusプラットフォームでプロジェクトを構築しています。