2016-12-15 3 views
1

Ich bin nicht in der Lage, den Grund für diese Ausnahme zu erhalten:Rückkehr aus BackgroundWorker.DoWork wirft 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); 
     } 
    } 
} 

es auf diese Ausnahme auslöst:

Eine nicht behandelte Ausnahme des Typs ‚System.Reflection.TargetInvocationException‘ in mscorlib aufgetreten. dll

Weitere Informationen: Das Ziel eines Aufrufs hat eine Ausnahme ausgelöst.

Das Ziel (zu meinem begrenzten Verständnis) ist die Funktion RunWorkerCompleted des Background:

 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; 
     } 

Es ist jedoch nicht einmal das erste Debug-Meldungsfeld erreicht. Es muss also zwischen der Rückkehr und dem Beginn der Funktion geschehen. Übergibt er nicht direkt an die RunWorkerCompleted-Funktion? Kann mir jemand sagen, was ich vermisse oder was ich falsch mache?

Dies ist meine erste Frage. Ich werde versuchen, so viele Informationen wie möglich zur Verfügung zu stellen. Google sucht nach den offensichtlichsten Suchanfragen.
+0

Sie können nicht auf GUI-Steuerelemente in der DoWork-Methode zugreifen, da dies in einem anderen Thread ist. Übergeben Sie alle Informationen, die Sie als Parameter benötigen, wenn Sie [RunWorkerAsync] (https://msdn.microsoft.com/en-us/library/f00zz5b2 (v = vs.110) .aspx) aufrufen. – LarsTech

+0

Soweit ich weiß, greife ich in meinem DoWork nicht auf GUI-Steuerelemente zu. Die "Main." Xx sind alle Teile einer separaten Klasse. – Rob

+0

Der Aufruf von 'MessageBox.Show' * greift * auf den GUI-Thread zu. – Crono

Antwort

2

Die Sache zu suchen, wenn Sie eine TargetInvocationException begegnen, ist die InnerException Eigenschaft, die die "echte" Ausnahme haben wird.

Vom Aussehen her wird es höchstwahrscheinlich etwas mit dem Versuch zu tun haben, auf die GUI aus dem Thread des Arbeiters zuzugreifen. Denken Sie daran, dass der Code bei Verwendung des Handlers DoWork in einem anderen Thread als der Hauptbenutzeroberfläche ausgeführt wird. Aufrufe an GUI-Komponenten müssen daher entweder über Invoke Aufrufe erfolgen oder alle zusammen vermieden werden.

+0

Ich habe versucht, die InnerException zu bekommen - aber nicht erfolgreich, da ich die Fehlermeldung msg überhaupt nicht bekomme. – Rob

+1

Ist der Debugger so eingestellt, dass er Ausnahmen unterbricht, wenn sie auftreten? Wenn dies der Fall ist, sollten Sie Zugriff auf die vollständige Ausnahmeinstanz über das Uhr-Tool-Fenster haben. – Crono

+0

Woher wissen Sie, dass Sie eine 'TargetInvocationException' an erster Stelle haben? – Crono

Verwandte Themen