Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 后台工作程序异常处理_C#_Multithreading_Backgroundworker - Fatal编程技术网

C# 后台工作程序异常处理

C# 后台工作程序异常处理,c#,multithreading,backgroundworker,C#,Multithreading,Backgroundworker,我对如何处理异常有点困惑 我有一个后台工作线程,它运行一些长时间运行的进程。我的理解是,如果后台工作线程发生异常,代码仍将以RunWorkerCompleted方法结束 void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) throw e.Error; 如果是这种情况,在bgWorker.RunWo

我对如何处理异常有点困惑

我有一个后台工作线程,它运行一些长时间运行的进程。我的理解是,如果后台工作线程发生异常,代码仍将以RunWorkerCompleted方法结束

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {

        if (e.Error != null)
           throw e.Error;
如果是这种情况,在bgWorker.RunWorkerAsync()周围放置一个try-catch块是否有意义;我想不会吧

我想重新显示在RunWorkerCompleted方法中捕获的异常,如何在不丢失堆栈跟踪的情况下执行此操作-我上面的内容正确吗?我读到当你重新引用一个异常时,你应该只使用“throw”

如果是这样的话,设置try-catch块有什么意义吗 围绕bgWorker.RunWorkerAsync()运行;我想不会吧

不,您不能这样做,因为
bgWorker.RunWorkerAsync()它是一种方法(而不是
事件
)。 如果您在Visual Studio调试器下运行,则调试器将在引发未处理异常的DoWork事件处理程序中的点处中断。 所以你可以这样做

 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //put your break point here 
                 // here you can capture your exception  
            }
            catch (Exception ex)
            {
                // here  catch your exception and decide what to do                  
                throw;
            }



        }

我建议您创建一些特定于业务的异常,它描述您在后台执行的操作。并将此异常与原始异常一起作为内部异常抛出:

private void bgWorker_RunWorkerCompleted(
    object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error != null)
        throw new BusinessSpecificException("Operation failed", e.Error);
    // ...
}
因此,原始异常及其堆栈跟踪将可用,并且您将抛出更具描述性的异常


注意-如果您不想创建新的异常类,可以使用现有的或。但它并没有提供那么多信息,如果你想在某个地方捕捉到它,那么你将无法只捕捉到这个特殊的异常

试试这个

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {

        if (e.Error != null)
           throw new Exception("My Custom Error Message", e.Error);

所以在这种情况下,我不需要在RunWorkerCompleted方法中进行任何错误处理?或者,处理RunWorkerCompleted方法中的任何错误是更好的做法吗?如果在工作线程中处理异常,则无法在RunWorkerCompleted中处理该异常,如果在DoWork中不处理该异常,则如果您做错了什么,应用程序可能会崩溃