繁体   English   中英

从BackgroundWorker.DoWork返回引发TargetInvocationException

[英]Return from BackgroundWorker.DoWork throws TargetInvocationException

我无法获得此异常的原因:

private void bwWorker_DoWork(object sender, DoWorkEventArgs e)
{
   if (Main.bolDebugMode)
      MessageBox.Show("Function DoWork is called");
   if (Main.ftpsync(Main.strUsername407, Main.strPassword407, sender as BackgroundWorker) == 0)
      e.Result = e.Result + "No error in " + Main.strUsername407;
   else
   {
      if (Main.bolDebugMode)
         MessageBox.Show("Errors in " + Main.strUsername407);
      e.Cancel = true;
      e.Result = e.Result + "Errors in " + Main.strUsername407;
      if (Main.bolDebugMode)
         MessageBox.Show("Errors marked");
      try
      {
         MessageBox.Show("Next step throws exception");
         return;
      }
      catch (Exception error)
      {
          if (error.ToString() != null)
             MessageBox.Show(error.InnerException.Message);
      }
   }
}

它引发以下异常:

mscorlib.dll中发生了类型为'System.Reflection.TargetInvocationException'的未处理异常

附加信息:调用的目标已引发异常。

目标(据我有限的理解)是背景工作人员的RunWorkerCompleted函数:

private void bwWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (Main.bolDebugMode)
                MessageBox.Show("DoWork Completed. Break: " + e.Cancelled + " Error: " + e.Error + " Result: " + e.Result);

            // First, handle the case where an exception was thrown.
            if (e.Error != null)
            {
                lStatus.Text = e.Error.Message;
            }
            else if (e.Cancelled)
                lStatus.Text = "Cancelled: " + e.Result.ToString();
            }
            else
            {
                lStatus.Text = "Done! " + e.Result;
                Thread.Sleep(Convert.ToInt16(Main.strGlobalWaitTime));
                pbProgress.Value = 0;
                lStatus.Text = "";
            }

            if (Main.bolDebugMode)
                MessageBox.Show("Analysis completed");

            // Enable the Start button.
            btnStart.Enabled = true;

            // Disable the Cancel button.
            btnCancel.Enabled = false;
        }
public class Main
{
    #region Variables
    // Variables - FTP Settings
    // Reading tons of variables from a appconfig file like so:
    private static string StrGlobalWaitTime = ConfigurationManager.AppSettings["program_globalWaitTime"]; 
    private static bool BolDeleteRemoteFiles = Convert.ToBoolean(ConfigurationManager.AppSettings["program_deleteremotefiles"]);

    // Configuring the variables to receive and write
    public static string strGlobalWaitTime
    {
        get { return StrGlobalWaitTime; }
        set { StrGlobalWaitTime = value; }
    }
    #endregion

    #region Main function
    public static int ftpsync(string strUsername, string strPassword, BackgroundWorker bwWorker)
    {
        if (Directory.EnumerateFiles(strWorkDirectory, "*.pdf").Any())
        {
            bwWorker.ReportProgress(0, "Files left! Upload not complete");
            Thread.Sleep(Convert.ToInt16(Main.strGlobalWaitTime));
            return 1;
        }

但是,它甚至没有到达第一个调试消息框。 因此,它必须在函数的返回和开始之间发生。 他的后台工作者是否没有直接移交给RunWorkerCompleted函数? 谁能告诉我我在想什么或做错了什么?

这是我的第一个问题。 我将尝试提供尽可能多的信息。 Google搜索最明显的查询已经完成。

每当遇到TargetInvocationException时要TargetInvocationException就是InnerException属性,该属性将具有“真实”异常。

从外观上看,它很可能与尝试从工作线程内部访问GUI有关。 请记住,使用DoWork处理程序时,代码在与主UI不同的线程中执行。 因此,对GUI组件的调用必须通过Invoke调用完成,或者完全避免。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM