C#完成背景工人具有自定义错误



我有一个背景工作者(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_runworkercompleted中的日志中。

我该怎么做?

如果要立即终止过程,则可以在此点throw一个例外。确保不会在呼叫层次结构的途中捕获异常。这将终止当前的运行过程,BWorker_RunWorkerCompleted将被调用。然后,您将最终进入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." );
    }
}

最好的做法是抛出比不明确的Exception更清楚的类型异常。它根本不包含任何有用的信息。而且您必须使用一个捕获所有例外的捕获块。

我通常使用InvalidOperationException很多。您无需创建自定义异常。除非需要为类型记录特定信息,否则请使用.NET框架中的一个。或者如果希望某人明确处理某些东西。

相关内容

  • 没有找到相关文章

最新更新