C# 如何停止长时间运行的任务在监视器上等待。在应用程序关闭时等待?

C# 如何停止长时间运行的任务在监视器上等待。在应用程序关闭时等待?,c#,task-parallel-library,C#,Task Parallel Library,我有一个长时间运行的任务,它会在监视器上内部阻塞。请等待,不要超时。我的类有一个Dispose方法,允许它解除阻塞,然后等待任务完成。但是,在某些用法中,我的客户机根本不会调用Dispose,这会导致任务永远被阻塞。 这会成为一个问题吗? 当客户端应用程序关闭时,如何向该任务发送信号? 我正在考虑使用Finalize方法,但对我来说它似乎很容易出错 编辑: 我发现了一篇很好的文章,在短短几页中就解释了很多这样的事情: 您需要使用监视器上的对象实例执行监视器.pulsell(对象)。等待(对象)正

我有一个长时间运行的任务,它会在监视器上内部阻塞。请等待,不要超时。我的类有一个Dispose方法,允许它解除阻塞,然后等待任务完成。但是,在某些用法中,我的客户机根本不会调用Dispose,这会导致任务永远被阻塞。 这会成为一个问题吗? 当客户端应用程序关闭时,如何向该任务发送信号? 我正在考虑使用Finalize方法,但对我来说它似乎很容易出错

编辑: 我发现了一篇很好的文章,在短短几页中就解释了很多这样的事情:
您需要使用
监视器上的对象实例执行
监视器.pulsell(对象)
。等待(对象)
正在等待

从MSDN:

监视器.脉冲

通知所有等待的线程对象状态的更改

解决办法是

  • 确保仔细管理使用
    Monitor
    方法的对象的生存期
  • Thread.Abort
    。绝对是个可怕的主意,但毫无疑问会有人提到它。它将完成工作,它可能会把事情搞得一团糟
  • 在调用
    Monitor.Wait
    之前,将
    对象
    参数注册到一个静态字段中,您可以在任何时间段使用该字段来
    pulsell
    。我不能推荐这是一个好的设计,但它是一个很好的绷带修复

您需要使用
监视器上的对象实例执行
监视器。pulsell(对象)
。等待(对象)
正在等待

从MSDN:

监视器.脉冲

通知所有等待的线程对象状态的更改

解决办法是

  • 确保仔细管理使用
    Monitor
    方法的对象的生存期
  • Thread.Abort
    。绝对是个可怕的主意,但毫无疑问会有人提到它。它将完成工作,它可能会把事情搞得一团糟
  • 在调用
    Monitor.Wait
    之前,将
    对象
    参数注册到一个静态字段中,您可以在任何时间段使用该字段来
    pulsell
    。我不能推荐这是一个好的设计,但它是一个很好的绷带修复

你滥用Dispose()而陷入了困境。客户端代码在关闭时不太可能使用它,当终结器在毫秒后运行时,提前处理非托管资源是没有意义的


但这不是一个问题。长时间运行的任务使用设置为true的线程。这节省了您的时间,CLR将在线程关闭时自动终止线程。在任何情况下,被阻止的任务都不会阻止程序正常结束。

您滥用Dispose()而陷入了这一困境。客户端代码在关闭时不太可能使用它,当终结器在毫秒后运行时,提前处理非托管资源是没有意义的

但这不是一个问题。长时间运行的任务使用设置为true的线程。这节省了您的时间,CLR将在线程关闭时自动终止线程。在任何情况下,被阻止的任务都不会阻止程序正常结束