我试图理解C#(Reference)中的数据并行性和进程,并且对行为感到有些困惑。我可能会遗漏一些非常基本的概念,但如果有人能解释这个概念会很棒。
所以我有以下代码: -
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方法中存在空引用异常。我不想使用task.Wait()来捕获并抛出异常,因为这将等待任务完成。
那么为什么会发生这种情况呢?我如何解决这个问题,以便在MonitorProcess方法中的异常处停止代码执行?
答案 0 :(得分:1)
任务在单独的线程中运行(一个来自线程池)。主线程中没有抛出异常,为什么主线程会停止?
由于两个线程并行执行,因此甚至可以在Process
方法中抛出异常之前打印(并返回)MonitorProcess
方法。
如果您希望主线程停止,则必须将异常传播给它。您可以在此处找到一些示例:A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was
但是在没有等待主线程的情况下执行此操作仍然不会阻止主线程打印,因为正如我已经说过的那样,代码可能已经被执行了。