我有以下代码,如果线程在 2 秒内未完成,我想中止它。您可以从第一个代码中看到我在 while 循环中创建了一个新的 myThread evertyime 并且不中止它。好吧,我不希望它是这样的,但是如果我将 myThread 置于循环之外并像第二个代码一样使用 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
}
我一开始尝试了下面的代码,但是它给出了线程异常。
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# 中完成的吗?例如线程。
需要提及的另一件事是我没有 Task 类或 socket.beginconnect() 方法,我猜这是因为我正在构建一个将在小板上运行的程序,而不是 PC。该板是netduido plus,我正在netduino plus平台上构建我的项目。