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. dllWeitere 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.
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
Soweit ich weiß, greife ich in meinem DoWork nicht auf GUI-Steuerelemente zu. Die "Main." Xx sind alle Teile einer separaten Klasse. – Rob
Der Aufruf von 'MessageBox.Show' * greift * auf den GUI-Thread zu. – Crono