C# 线程模式 - 这是个好主意吗?

标签 c# .net multithreading

我今天在玩我的一个项目时发现了一个有趣的小片段,给定以下模式,您可以安全地清理一个线程,即使它被迫提前关闭。我的项目是一个网络服务器,它为每个客户端生成一个新线程。我发现这对于从远程端提前终止很有用,但对于本地端也很有用(我可以从我的处理代码中调用 .Abort())。

您是否可以看到任何问题,或者您对任何正在研究类似方法的人有什么建议?

测试用例如下:


using System;
using System.Threading;

class Program
{
    static Thread t1 = new Thread(thread1);
    static Thread t2 = new Thread(thread2);

    public static void Main(string[] args)
    {
        t1.Start();
        t2.Start();
        t1.Join();
    }

    public static void thread1() {
        try {
            // Do our work here, for this test just look busy.
            while(true) {
                Thread.Sleep(100);
            }
        } finally {
            Console.WriteLine("We're exiting thread1 cleanly.\n");
            // Do any cleanup that might be needed here.
        }
    }

    public static void thread2() {
        Thread.Sleep(500);
        t1.Abort();
    }
}

作为引用,如果没有 try/finally block ,线程就会像预期的那样死掉。

最佳答案

除非整个应用程序都崩溃,否则完全中止另一个线程只是一个坏主意。很容易让您的程序处于未知状态。中止您的自己的线程偶尔有用 - 例如,如果您想提前结束响应,ASP.NET 会抛出 ThreadAbortException - 但这不是一个非常好的设计。

线程的安全清理应该是相互的——应该有一些共享标志请求线程关闭。线程应定期检查该标志并适当退出。

关于C# 线程模式 - 这是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/597590/

相关文章:

c# - 一天中特殊时间图表

c# - 通过 C# 控制物理设备

c# - Xamarin.Forms PCL javax.net.ssl.SSLHandshakeException

c# - 如何让类更具可测性?

java - 在主线程中等待,直到取消的执行器任务完成

c# - 按 unicode 类别拆分字符串

c# - 模拟通用方法

java - 比较新项目的 ASP.NET MVC 和 Grails

java - Spring集成MessageQueue无需轮询

c++ - 如何在没有内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset<N>*>?