代码之家  ›  专栏  ›  技术社区  ›  Jason Young

在.NET中重新启动简单后台线程

  •  0
  • Jason Young  · 技术社区  · 15 年前

    不过,我想知道我是否能做得更好。应该可以编写一个简单的函数,在线程失败时重新启动线程。这将是相当简单的,甚至把一些规则,以尝试立即重新启动,然后延迟后续的重新启动尝试。基本上,它将充当单个线程的非常基本的服务控制管理器。

    注意:我所说的“重启”是指在新线程上再次调用该方法。

    在我自己写这篇文章之前,是否有任何现有的解决方案需要我评估?

    我这么问是因为这似乎不是什么新问题。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Reed Copsey    15 年前

    我认为这里有一个更根本的问题:

    如果异常确实是由第二次不会发生的事情引起的,那么重试就没有问题。但是,没有什么理由产生一个新的线程-只要让你的线程(在它的try/catch中)重试这个操作。您可以在一个简单的循环中轻松地做到这一点—一个简单的实现(不建议这样做,因为它可能永远不会结束,但它可以为您提供正确的想法)可以是:

    bool failed = false;
    do
    {
       try
       {
           failed = false;
           DoDangerousOperation();
       }
       catch(MyException e)
       {
           failed = true;
       }
    } while (failed);
    

    如果没有,那么您应该尝试调试其他一些问题,很可能是多线程导致的微妙的争用情况。

        2
  •  0
  •   Samuel Neff    15 年前

    您确实需要在所有线程入口点周围设置try/catch以防止崩溃。这包括呼叫线程。开始, ThreadPool.QueueUserWorkItem,BeginInvoke,异步回调等。也不要忘记终结器,那里的错误也会使应用程序崩溃。

    就“重启”线程而言,这可能是极其危险的。对所有线程执行此操作意味着您将不知道已经发生了什么,也不知道应用程序处于什么状态,而且您可能会在第一时间合成任何导致异常的问题。它也不太可能成功,除非例外是暂时的,比如网络或基于资源的。

    有针对性的重试对于可能暂时出错的特定类型的操作很有用。