C#正在使用自定义错误完成后台工作程序

C#正在使用自定义错误完成后台工作程序,c#,multithreading,visual-studio-2008,.net-3.5,backgroundworker,C#,Multithreading,Visual Studio 2008,.net 3.5,Backgroundworker,我有一个后台工作人员(NET 3.5和Visual Studio 2008),负责执行一些长时间任务: private void BWorker_DoWork(object sender, DoWorkEventArgs e) { string filename = GetFileName(); if (!string.IsNullOrEmpty(filename)) {

我有一个后台工作人员(NET 3.5和Visual Studio 2008),负责执行一些长时间任务:

        private void BWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            string filename = GetFileName();

            if (!string.IsNullOrEmpty(filename))
            {
                // Do long task
            }
            else
            {
               // Finish background worker with a custom error message
               // in order to receive it in BWorker_RunWorkerCompleted and log it. Some kind of:
                 e.Error.Message = "my custom message error".
            }
        }

        private void BWorker_ProcessChanged(object sender, ProgressChangedEventArgs e)
        {
        }

        private void BWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                Logger.Process("Cancelled.");
            }
            else if (e.Error == null)
            {
                Logger.Process("Successfully completed");
            }
            else
            {
                // Log here my custom error
                Logger.Error(string.Format("Completed with errors: {0}", e.Error.Message));
            }
        }
在长时间的任务中,我检查了很多东西,所以如果一个失败了,我想根据情况“强制”后台工作人员以自定义错误完成(如果任何东西失败了,则无需继续执行后台工作人员)。然后,此错误将打印到BWorker_Runworker Completed中的日志中


我该怎么做?

如果您想立即终止您的进程,您可以
在该点抛出一个异常。确保在向上调用层次结构的过程中未捕获异常。这将终止当前正在运行的进程,并将调用
BWorker\u runworker completed
。然后,您将进入
else
子句,您可以在其中记录消息

throw new Exception("My custom Message");
应用于您的简单示例,它将如下所示:

if (!string.IsNullOrEmpty(filename))
{
    // Do long task
}
else
{
     // Finish background worker with a custom error message
     // in order to receive it in BWorker_RunWorkerCompleted and log it. 
     throw new Exception("my custom message error");.
}

您还可以创建自己的自定义异常并将其抛出。由于
DoWork
方法在单独的后台/工作线程上运行,因此异常处理方式不同,因此在中解释了如何执行此操作。抛出异常时,应在
RunWorkerCompleted
事件中处理这些异常。像这个例子:

private void BWorker_DoWork(object sender, DoWorkEventArgs e)
{
    string filename = GetFileName();

    if ( !string.IsNullOrEmpty( filename ) )
    {
        // Do long task
    }
    else
    {
        throw new InvalidOperationException( "my custom message error" );
    }
}

private void BWorker_RunWorkerCompleted( object sender , RunWorkerCompletedEventArgs e )
{
    if ( e.Error != null )
    {
        // my custom message error
        Logger.Process( e.Error.ToString() );
    }
    else if ( e.Cancelled )
    {
        Logger.Process( "Cancelled." );
    }
    else
    {
        Logger.Process( "Success." );
    }
}
最佳做法是抛出比非特定的
异常更清晰的类型异常。它根本不包含任何有用的信息。您必须使用捕获所有异常的catch块

我通常经常使用
invalidooperationexception
。您不需要创建自定义异常。除非需要记录类型的特定信息,否则请使用.NET Framework中的。或者如果你想让某人明确地处理某件事