gpt4 book ai didi

c# - 如何有效地终止 C# 中的线程?

转载 作者:可可西里 更新时间:2023-11-01 03:07:18 31 4
gpt4 key购买 nike

我不是tryingbeat一个dead horse , honestly .我已经阅读了所有关于线程终止的建议,但是,请考虑代码。它执行以下操作:

  1. 它启动一个线程(通过StartThread 方法)
  2. 它调用数据库在 ServiceBroker 队列中查找任何内容。请注意 WAITFOR 命令 - 这意味着它会一直坐在那里直到队列中有内容。所有这些都在 MonitorQueue 方法中。
  3. 终止线程。我尝试了 .Interrupt - 它似乎什么也没做。然后我尝试了 .Abort,它永远不应该被使用,但即使这样也没有任何作用。

    Thread thxMonitor = new Thread(MonitorQueue);
    void StartThread() {
    thxMonitor.Start();
    }

    void MonitorQueue(object obj) {
    var conn = new SqlConnection(connString);
    conn.Open();
    var cmd = conn.CreateCommand();
    cmd.CommandTimeout = 0; // forever and ever
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM SBQ)";

    var dataTable = new DataTable();
    var da = new SqlDataAdapter(command);

    da.Fill(dataTable);
    da.Dispose();
    }

    void KillThreadByAnyMeansNecessary() {
    thxMonitor.Interrupt();
    thxMonitor.Abort();
    }

真的有可能杀死一个线程吗?

最佳答案

设置一个中止标志来告诉线程需要终止。将虚拟记录附加到 ServiceBroker 队列。 WAITFOR 然后返回。然后线程检查它的“中止”标志,发现它已设置,从队列中删除虚拟记录并退出。

另一种变体是在 ServiceBroker 监控的表的规范中添加“真实的”毒丸记录 - 非法记录号等。这将完全避免以任何直接方式接触线程 - 总是一件好事:)这可能更复杂,特别是如果每​​个工作线程都被期望在实际终止时通知,但如果工作线程仍然有效, ServiceBroker 和 DB 都在不同的盒子上。我将其添加为编辑,因为在考虑更多之后,它似乎更灵活,毕竟,如果线程通常仅通过以下方式进行通信。数据库,为什么不只用数据库关闭它们?没有 Abort(),没有 Interrupt(),希望没有产生锁定的 Join()。

关于c# - 如何有效地终止 C# 中的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12468734/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com