Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 垃圾收集器&x27;s";“保持活力”;和线程_C#_.net_Multithreading_Garbage Collection - Fatal编程技术网

C# 垃圾收集器&x27;s";“保持活力”;和线程

C# 垃圾收集器&x27;s";“保持活力”;和线程,c#,.net,multithreading,garbage-collection,C#,.net,Multithreading,Garbage Collection,我有一个应用程序,它是对某人的某种测试,大约持续30分钟。在程序启动期间(第三方),我的代码被调用,我注册时间并向应用程序返回一些信息,我将测试保存为“正在进行” 大约30分钟后,我希望程序返回给我并将测试结果发送给我,以便我可以保存并完成该过程。有时,由于各种原因,这种情况不会发生。 所以我想在实现一个代码时启动一个线程,让它休眠大约35分钟(最长持续时间),当它运行时,它只做一件事:如果测试仍然是“正在进行的”,它会将它更新为“失败”或其他状态 然而,我从C#的垃圾收集器中了解到,它可以收集

我有一个应用程序,它是对某人的某种测试,大约持续30分钟。在程序启动期间(第三方),我的代码被调用,我注册时间并向应用程序返回一些信息,我将测试保存为“正在进行”

大约30分钟后,我希望程序返回给我并将测试结果发送给我,以便我可以保存并完成该过程。有时,由于各种原因,这种情况不会发生。 所以我想在实现一个代码时启动一个线程,让它休眠大约35分钟(最长持续时间),当它运行时,它只做一件事:如果测试仍然是“正在进行的”,它会将它更新为“失败”或其他状态

然而,我从C#的垃圾收集器中了解到,它可以收集假定为非活动的线程,对此我很担心,所以我想问一下这个方法如何处理线程,或者是否有可靠的方法来测试它(因为即使我等了35分钟,等待它发生,也可能会出现GC实际收集线程而所有操作都失败的情况)

那么,正确的方法是什么,或者如果不是这样,我应该怎么做

static void Main(string[] args)
{
    //After all the startup functions are done...
    Thread thread = new Thread( () => UpdateTest(1) );
    thread.Start();

    //My thread is supposedly safe...?
    GC.KeepAlive(thread);
}

static void UpdateTest(int testID)
{
    Thread.Sleep(210000); //Sleep for 35min

    //Search the database for the testID, update it if it's still ONGOING.
}

由于GC的原因,线程不会中止。事实上,不可能可靠地中止线程。(尝试中止
尝试{}最后{while(true);}

你提到的答案是错误的。但这个问题有3个正确答案。你只是碰巧相信了错误的、少数族裔的答案


您无需解决任何问题。

线程不会因为GC而中止。事实上,不可能可靠地中止线程。(尝试中止
尝试{}最终{while(true);}

你提到的答案是错误的。但这个问题有3个正确答案。你只是碰巧相信了错误的、少数族裔的答案


没有问题需要你去解决。

为长时间运行的流程提供服务能帮你解决这个问题吗?如果你说的是jitbit的答案,我怀疑这不仅仅是表面上的问题。这不是GC…基本上这个问题是你已经链接到的问题的重复,不是吗?@JonSkeet我不认为它是重复的,因为我的线程根本不会运行,它在启动之前会休眠很长时间,所以基本上这是一个关于jitbit答案的问题。这就是为什么我寻找解决方案并找到KeepAlive方法的原因。@Danicco:所以你应该对jitbit的答案添加注释。如果线程处于休眠状态,它基本上仍然处于活动状态。我对jitbit的答案有强烈的怀疑…
KeepAlive
在那里没有什么作用,因为它只在当前方法中保持对象的活动状态。
Start
是非阻塞的,因此主线程几乎会立即退出。然后,该程序由派生的线程保持运行。这会使服务持续很长一段时间吗nning过程为您处理这个问题?如果您谈论的是jitbit的答案,我怀疑这其中有很多。它不是GC…基本上这个问题是您已经链接到的问题的重复,不是吗?@JonSkeet我不认为它是重复的,因为我的线程根本不会运行,它在运行之前会休眠很长时间重新开始,所以基本上这是一个关于jitbit答案的问题。这就是为什么我寻找解决方案并找到KeepAlive方法的原因。@Danicco:所以你应该对jitbit的答案添加一条评论。如果线程处于睡眠状态,它基本上仍然处于活动状态。我对jitbit的答案有强烈的怀疑…
KeepAlive
不会出现g需要做很多工作,因为它只在当前方法中保持对象的活动状态。
Start
是非阻塞的,因此主线程几乎会立即退出。然后,该程序将由派生线程保持运行。我怀疑答案会存在更长的时间。@LynnCrumbling这是高体验的责任,因此用户不会o否决这些答案。到目前为止,责任还没有被追究。请投票赞成删除该答案。这会误导初学者,如果他们不像OP那样提问,这本身就是误解。我怀疑这个答案会存在更长时间。@LynnCrumbling高体验用户有责任否决such回答。到目前为止,责任还没有被追究。请投票赞成删除该答案。这会误导初学者,如果他们不像OP那样提问,这本身就是一种误解。