C# 如何停止长时间运行的任务在监视器上等待。在应用程序关闭时等待?
我有一个长时间运行的任务,它会在监视器上内部阻塞。请等待,不要超时。我的类有一个Dispose方法,允许它解除阻塞,然后等待任务完成。但是,在某些用法中,我的客户机根本不会调用Dispose,这会导致任务永远被阻塞。 这会成为一个问题吗? 当客户端应用程序关闭时,如何向该任务发送信号? 我正在考虑使用Finalize方法,但对我来说它似乎很容易出错 编辑: 我发现了一篇很好的文章,在短短几页中就解释了很多这样的事情:C# 如何停止长时间运行的任务在监视器上等待。在应用程序关闭时等待?,c#,task-parallel-library,C#,Task Parallel Library,我有一个长时间运行的任务,它会在监视器上内部阻塞。请等待,不要超时。我的类有一个Dispose方法,允许它解除阻塞,然后等待任务完成。但是,在某些用法中,我的客户机根本不会调用Dispose,这会导致任务永远被阻塞。 这会成为一个问题吗? 当客户端应用程序关闭时,如何向该任务发送信号? 我正在考虑使用Finalize方法,但对我来说它似乎很容易出错 编辑: 我发现了一篇很好的文章,在短短几页中就解释了很多这样的事情: 您需要使用监视器上的对象实例执行监视器.pulsell(对象)。等待(对象)正
您需要使用
监视器上的对象实例执行监视器.pulsell(对象)
。等待(对象)
正在等待
从MSDN:
监视器.脉冲
通知所有等待的线程对象状态的更改
解决办法是
- 确保仔细管理使用
方法的对象的生存期Monitor
。绝对是个可怕的主意,但毫无疑问会有人提到它。它将完成工作,它可能会把事情搞得一团糟Thread.Abort
- 在调用
之前,将Monitor.Wait
参数注册到一个静态字段中,您可以在任何时间段使用该字段来对象
。我不能推荐这是一个好的设计,但它是一个很好的绷带修复pulsell
监视器上的对象实例执行监视器。pulsell(对象)
。等待(对象)
正在等待
从MSDN:
监视器.脉冲
通知所有等待的线程对象状态的更改
解决办法是
- 确保仔细管理使用
方法的对象的生存期Monitor
。绝对是个可怕的主意,但毫无疑问会有人提到它。它将完成工作,它可能会把事情搞得一团糟Thread.Abort
- 在调用
之前,将Monitor.Wait
参数注册到一个静态字段中,您可以在任何时间段使用该字段来对象
。我不能推荐这是一个好的设计,但它是一个很好的绷带修复pulsell
但这不是一个问题。长时间运行的任务使用设置为true的线程。这节省了您的时间,CLR将在线程关闭时自动终止线程。在任何情况下,被阻止的任务都不会阻止程序正常结束。您滥用Dispose()而陷入了这一困境。客户端代码在关闭时不太可能使用它,当终结器在毫秒后运行时,提前处理非托管资源是没有意义的 但这不是一个问题。长时间运行的任务使用设置为true的线程。这节省了您的时间,CLR将在线程关闭时自动终止线程。在任何情况下,被阻止的任务都不会阻止程序正常结束