手动计时C#螺纹

手动计时C#螺纹,c#,multithreading,timeout,C#,Multithreading,Timeout,我需要为长时间运行的线程添加超时。我们遇到了一些外部问题,这些问题有时会导致线程无限期地挂起在某一行代码上。为了使我们的进程更加健壮,我们希望检测线程不再主动运行/轮询,并中止线程。这将允许我们清理资源并重新启动线程 //suspect thread foreach(var thing in whatever) { //do some stuff SomeClass.StaticVariable = DateTime.Now; } //monitor thread while(

我需要为长时间运行的线程添加超时。我们遇到了一些外部问题,这些问题有时会导致线程无限期地挂起在某一行代码上。为了使我们的进程更加健壮,我们希望检测线程不再主动运行/轮询,并中止线程。这将允许我们清理资源并重新启动线程

//suspect thread
foreach(var thing in whatever)
{
    //do some stuff
    SomeClass.StaticVariable = DateTime.Now;
}

//monitor thread
while(shouldStillBeWorking)
{
    Thread.Sleep(TimeSpan.FromMinutes(10));
    if (DateTime.Now.Subtract(TimeSpan.FromMinutes(15) < SomeClass.StaticVariable)
        suspectThread.Abort()
}
添加此功能的首选方法是什么?

您需要两件事:

  • 可以执行监视和中止的其他线程(您的“监视”线程)
  • 查看可疑线程是否仍在工作的一些机制
  • 在最简单的版本中,可疑线程以可靠的频率使用当前时间更新共享静态变量。如何融入线程的控制流取决于您(这是最困难的部分-您通常会使用另一个线程来做这类事情)。然后让第二个线程唤醒,并每隔一段时间检查一次。如果不是最近,请中止线程

    //suspect thread
    foreach(var thing in whatever)
    {
        //do some stuff
        SomeClass.StaticVariable = DateTime.Now;
    }
    
    //monitor thread
    while(shouldStillBeWorking)
    {
        Thread.Sleep(TimeSpan.FromMinutes(10));
        if (DateTime.Now.Subtract(TimeSpan.FromMinutes(15) < SomeClass.StaticVariable)
            suspectThread.Abort()
    }
    
    //可疑线程
    foreach(任何事物的变量)
    {
    //做点什么
    SomeClass.StaticVariable=DateTime.Now;
    }
    //监视线程
    当(应该仍在工作)
    {
    睡眠(时间跨度从分钟(10));
    if(DateTime.Now.Subtract(TimeSpan.FromMinutes(15)
    首选方法是在自己的进程中运行不可靠的子系统,而不是在自己的线程中。这样,当它表现不好时,您可以破坏整个进程,并让操作系统清理掉它留下的任何可怕的混乱。杀死在您的进程中运行不可靠代码的线程可能会有各种令人讨厌的副作用对代码的影响,因为操作系统无法知道哪些资源属于行为不良的线程,哪些资源仍在使用


    长话短说:不要与无法控制的代码共享进程。

    在主应用程序中启动计时器,在超时时间过后中止工作线程。使用工作线程的回调方法重置计时器。

    这对我来说不太可行,因为我需要从此进程返回结果(它是IBM MQSeries客户端)。因此,这将使这个单独的过程难以将数据返回到我的应用程序。@Joel:然后你必须决定你喜欢什么:健壮而笨拙,还是脆弱而简单。设计当然是一种妥协的艺术,最能服务于你的客户和利益相关者;你的客户和利益相关者是否高度重视产品的健壮性r或低于编写产品的易用性?+1用于单独的进程,尽管我的回答是这样的。@Joel,为什么不让最后一次轮询将结果传达给您的监视进程(在结束进程之前)?对于进程间通信,我假设您使用的是XML-RPC或其他东西。将可疑进程设为“从进程”。这与我想解决问题的方式一致。很高兴看到其他人验证了它。虽然我可以感谢Eric的回答,但它根本不适合我的特定应用。谢谢大家!