c# - 多线程未处理的异常

标签 c# .net multithreading

我正在从事一个将启动多个独立流程的项目。我希望他们被隔离到这样一个地步,如果一个意外失败,其他人将继续而不会受到影响。我尝试了一个 POC(粘贴在下面)来使用 AppDomains 对此进行测试,但它仍然会使整个父应用程序崩溃。

我是不是采取了错误的方法?如果是这样,我应该做什么?如果不是,我做错了什么?

class Program
{
    static void Main(string[] args)
    {
        Random rand = new Random();
        Thread[] threads = new Thread[15];
        for (int i = 0; i < 15; i++)
        {
            AppDomain domain = AppDomain.CreateDomain("Test" + i);
            domain.UnhandledException += new UnhandledExceptionEventHandler(domain_UnhandledException);
            domain.
            Test test = domain.CreateInstanceFromAndUnwrap(Assembly.GetExecutingAssembly().Location, "ConsoleApplication1.Test") as Test;
            Thread thread = new Thread(new ParameterizedThreadStart(test.DoSomeStuff));
            thread.Start(rand.Next());
            Console.WriteLine(String.Format("Thread #{0} has started", i));
            threads[i] = thread;
        }

        for (int i = 0; i < 15; i++)
        {
            threads[i].Join();
            Console.WriteLine(String.Format("Thread #{0} has finished", i));
        }
        Console.ReadLine();
    }

    static void domain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Console.WriteLine("UNHANDLED");
    }


}

public class Test : MarshalByRefObject
{
    public void DoSomeStuff(object state)
    {
        int loops = (int)state;
        for (int i = 0; i < loops; i++)
        {
            if (i % 300 == 0)
            {
                // WILL break
                Console.WriteLine("Breaking");
                int val = i / (i % 300);
            }
        }
    }
}

编辑

请注意“测试”类非常简单。实际实现将极其复杂,并且很可能在异常处理方面存在差距。

最佳答案

您不需要单独的 AppDomain。您需要做的就是在 Test 类的 DoSomeStuff 成员中捕获异常。因此,如果其中一个线程处理了自己的异常,那么您的应用程序的其余部分可以继续运行。

关于c# - 多线程未处理的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5478050/

相关文章:

multithreading - 有没有办法从进程的 task_struct 中找出哪个用户拥有进程?

c# - 在 C# 中从复杂的 JSON 结构中提取数据

c# - 如何在 JSON 中为空 DataTable 包含列元数据

c# - 数据网格单元格单击事件

javascript - &lt;script&gt; &lt;/script&gt; block 中空格的规范化

java - SingleTon 类未同步并返回多个实例

c# - 如何初始化动态创建的数组对象?

c# - 通过 switch 语句掉线(有时有效?)

c# - 在 NUnit 3 中使用 [TestCase] 属性测试异常?

java - Fork-Join 线程池中长时间运行的任务是否会阻塞所有线程?