使用C#中的任务并行性和进程

本文关键字:并行性 进程 任务 使用 | 更新日期: 2023-09-27 18:22:04

我试图理解C#(参考)中的数据并行性和进程,但对这种行为有点困惑。我可能错过了一些真正基本的概念,但如果有人能解释这个,那就太好了

所以我有以下代码:-

private static void Process()
        {
            Process _process = new Process();
            _process.StartInfo.FileName = "C:''Windows''notepad.exe";
            _process.StartInfo.UseShellExecute = false;
            _process.StartInfo.RedirectStandardOutput = true;
            // Start the process
            _process.Start();
            _process.BeginOutputReadLine();
            Task task = Task.Factory.StartNew(() => MonitorProcess());

            Console.WriteLine("Main ");
        }
       private static void MonitorProcess()
        {
            Console.WriteLine("Inside Monitor");
            string x = null;
            x = x.Trim();
        }

现在我的期望是,"Main"永远不应该打印到控制台,因为MonitorProcess方法中存在null引用异常。我不想使用task。Wait()捕获并抛出异常,因为这将等待任务完成。

那么,为什么会发生这种情况,我如何绕过这种情况,以便在MonitorProcess方法中的异常处停止代码执行呢?

使用C#中的任务并行性和进程

任务在单独的线程(线程池中的一个线程)中运行。异常没有在主线程中抛出,那么为什么主线程应该停止呢?

由于这两个线程是并行执行的,因此Process方法甚至可能在MonitorProcess方法中抛出异常之前打印(并返回)。

如果你想让你的主线程停止,你必须将异常传播给它;通过等待任务或访问其exception属性,未观察到s个异常。因此,未观察到的异常是

但是这样做而不在主线程中等待仍然不会阻止主线程打印,因为正如我已经说过的,代码可能已经被执行了。