c# - 协调工作线程关闭

标签 c# vb.net multithreading

我有一个 List(Of IWorker),其中包含许多具体内容。 IWorker 依次有一个 Startup()Shutdown() 方法。

在 Worker 类中,Startup() 创建一个新的工作线程,然后返回。 Shutdown() 目前设置一个私有(private)的 ShutDownRequested 标志并返回。该标志由工作线程检查(最坏情况下每隔几秒检查一次)。

一切正常,但目前父应用无法确定 Worker 是否已完成关闭。

我可以看到很多解决方法,但不确定最好的方法是什么。

  • State 属性添加到 IWorker。应该可行,但我将要轮询状态,这似乎有点令人讨厌。
  • 阻止关闭命令 - 可能是我理想的解决方案,但我不确定如何实现它 - worker Sunclock 是一个私有(private)对象吗 Shutdown() 设置标志后还应该尝试同步时钟吗?
  • 还有别的吗?

感谢任何文章、意见或建议。 C# 或 VB 中的示例都可以。

最佳答案

如果您希望关闭是一个阻塞操作,我不会尝试使用锁定来阻塞 Shutdown()

如果您可以使用 .NET 4,我会将您的内部执行方法设为任务。然后您可以调用 Task.Wait() 来阻塞直到它完成。

如果您必须使用 .NET 3.5 或更早版本,我会让 Shutdown() 调用在内部等待 WaitHandle,例如 ManualResetEvent。关闭代码可能如下所示:

' Include:
Private shutdownEvent as ManualResetEvent = new ManualResetEvent(false)

Sub Shutdown()
    ShutDownRequested = True
    shutdownEvent.WaitOne()
End Sub

然后轮询循环(线程操作)将执行:

Sub Execute()
    While Not ShutDownRequested
        ' Do your work
    End While

    ' Before you exit, "set" the event:
    shutdownEvent.Set()
End Sub

关于c# - 协调工作线程关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7968962/

相关文章:

c# - 最后锁定后,代码未在 IAsyncEnumerable 迭代器中执行

c# - 我应该采取什么方法来分割字符串并更新多个 SQL 表?

java - 理解tomcat/spring boot多线程

python - 创建可访问 app_globals 的 Pylons 线程

java - 如何在单独的线程中进行单例的急切初始化?

c# - 从默认的 mvc 应用程序数据库中删除用户

c# - 如何确定给定方法可以抛出哪些异常?

vb.net - vb.net 项目的单元测试

vb.net - 如果某些条件匹配,则从列表中删除当前项目

c# - 使用 ffmpeg.autogen,从 IP 摄像机捕获视频,但未捕获音频,代码中是否缺少任何内容?