gpt4 book ai didi

c# - 中止一个线程还是让它被计算机清理?

转载 作者:行者123 更新时间:2023-11-30 18:35:41 25 4
gpt4 key购买 nike

我有以下代码,如果线程在 2 秒内未完成,我想中止该线程。您可以从第一个代码中看到,我在 while 循环中创建了一个新的 myThread,并且没有中止它。好吧,我不希望它变成这样,但是如果我将 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
}

一开始我尝试了以下代码,但是它给出了 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# 中究竟是如何完成的?例如线程。
另一件需要提及的事情是我没有 Task 类或 socket.beginconnect() 方法,我猜这是因为我正在构建一个将在小板而不是 pc 上运行的程序。该板是 netduido plus,我正在 netduino plus 平台上构建我的项目。

最佳答案

I have the following code, I want to abort a thread if it is unfinished in 2 secs.

阅读代码,看起来您实际上想要尝试在两秒内将套接字连接到资源。如果超过两秒,你想继续。

我主要是重现 this answer 中的代码,我相信这大致是您为实现目标应该做的事情,而不是启动一个线程然后中止它:

Socket socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);

// Connect using a timeout (2 seconds)

IAsyncResult result = socket.BeginConnect( sIP, iPort, null, null );

bool success = result.AsyncWaitHandle.WaitOne( 2000, true );

if ( !success )
{
// NOTE, MUST CLOSE THE SOCKET

socket.Close();
throw new ApplicationException("Failed to connect server.");
}

// Success
//...

关于c# - 中止一个线程还是让它被计算机清理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14615860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com