线程会自动关闭吗?

29

我正在使用一个Gmail类,以便我的应用程序可以通过Gmail向我发送通知。

实现方法如下:

public static void SendMessage(string message)
{
    Notification.message = message;

    Thread t = new Thread(new ThreadStart(SendMessageThreaded));
    t.Start();
}

而线程函数看起来像这样:

private static void SendMessageThreaded()
{
    try
    {
        if (Notification.message != "")
            RC.Gmail.GmailMessage.SendFromGmail("accname", "accpass", "email", "subject", Notification.message);

        Notification.message = "";
    }
    catch
    { }
}

在运行SendMessageThreaded之后,它会自动关闭还是我需要手动关闭呢?

t.Start()
t.Abort()

或者是一些其他的东西?
7个回答

40

需要启动线程一次,此时它将执行分配给它的代码块并退出。

在大多数情况下,您不需要显式清理线程(除非您想要尽早退出)。


8

是的,线程会自行关闭。

当在第二个线程中运行的所有指令已经被调用时,线程就会关闭。


7
是的,当它结束时,它会自动关闭。

6

SendFromGmail完成后,线程将超出范围并可供垃圾回收使用。

因此,是的,它会自动关闭。


5
不必担心,如果没有其他任务需要处理,它会返回到线程池并等待,如果仍然没有任务,它会自行关闭。

2

是的,它会关闭,但是你应该设置一个超时时间以避免僵尸进程,即使主线程在第二个线程等待时崩溃。


1

Abort() 方法会抛出一个 ThreadAbortException 异常,你可以进行处理:

public void SendMessageThreaded()
{
    try
    {
        // thread logic
    }
    catch (ThreadAbortException tae)
    {
        // thread was aborted, by t.Abort()
    }
    catch (Exception ex)
    {
        // other error
    }
}

通过使用

t.Abort(myObject)

你可以“发送”任何帮助你处理中止处理的对象。你可以使用ExceptionState属性来访问该对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接