我正在运行一个while循环,它会永远跟踪一些事件。如果我得到任何异常,我将其引用更改为null,希望当前线程将被中止,并且将创建该线程的新引用。它是正确的还是更好的方法来中止当前线程并开始更新的线程。
我正在尝试这样做:
Thread th;
Main()
{
th = new thread(myfunction);
th.Start();
}
void myfunction()
{
while(true)
{
try
{
// something interesting here.
}
catch(exception)
{
th = null;
}
}
}
答案 0 :(得分:1)
清理该线程所需的任何内容,然后像这样突破while循环:
void runningOnThread()
{
while (true)
{
try
{
//...
}
catch (Exception e)
{
break;
}
}
//thread cleanup code goes here, if you have any.
}
在捕获异常时记录异常是个好主意。这样你就知道什么时候遇到异常。
答案 1 :(得分:1)
唯一会发生的事情是,Enclosing类仍然无法访问Thread。
如果没有进一步处理,这样做将使GC appllication roots无法访问该线程。这使得对象可用于下一个GC触发器中的垃圾收集。
答案 2 :(得分:1)
你需要这样做:
return;
而不是:
th = null;
因为线程会继续运行。线程对象不会被收集,因为只要代码正在运行它就会保持引用。
答案 3 :(得分:1)
首先,如果遇到异常,在担心启动新线程之前,请确保实际处理异常并确保重新启动的线程能够成功运行。否则,你只会在处理异常游行时获得持续的崩溃线程和一个不稳定的程序。只是一些值得思考的东西。
现在,回答这个问题,最好的情况是对线程的引用进行归零会让你处于一个无限循环中,最糟糕的情况是你试着稍后使用'th'然后你得到一个异常,因为它是null。取消对线程的引用不会以某种方式让它意识到它需要重新启动自己,而不是将对作为函数参数的参数的引用置零。如果您绝对需要某种能力来中止/重新启动线程,请查看以下操作之一:
这段代码完全脱离了我的头脑,不是那么好,但会给你一般的想法:
delegate void ThreadCrashedEvent();
Event ThreadCrashedEvent threadCrashed;
Thread th;
Main()
{
threadCrashed += OnThreadCrashed();
th = new thread(myfunction);
th.Start();
}
void OnThreadCrashed()
{
th = new thread(myfunction);
th.Start();
}
void myfunction()
{
while(true)
{
try
{
LetsGetDangerous();
}
catch(exception)
{
if(threadCrashed != null)
{
threadCrashed();
return;
}
}
}