2

I have a backgroundworker:

private readonly BackgroundWorker _importWorker = new BackgroundWorker() { WorkerReportsProgress = true };

In my constructor I do:

_importWorker.DoWork += _importWorker_DoWork;
_importWorker.ProgressChanged += _importWorker_ProgressChanged;
_importWorker.RunWorkerCompleted += _importWorker_RunWorkerCompleted;

Here are the delegates:

private void _importWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        var args = (object[]) e.Argument;
        var walletColumnName = (string) args[0];
        var fundColumnName = (string) args[1];
        var isinColumName = (string) args[2];
        var marketValueDirtyColumnName = (string) args[3];
        var seperator = (string) args[4];
        var importFilePath = (string) args[5];
        var importFile = Path.GetFileName(importFilePath);

        var onePercent = 100.0 / File.ReadLines(importFilePath).Count();
        var totalPercentage = 0.0;


        var parser = new TextFieldParser(importFilePath);
        parser.TextFieldType = FieldType.Delimited;
        parser.SetDelimiters(seperator);

        //Read colum indexes on the first line
        var fields = parser.ReadFields();
        var walletColumnIndex = Array.IndexOf(fields, walletColumnName);
        var fundColomnIndex = Array.IndexOf(fields, fundColumnName);
        var isinColumnIndex = Array.IndexOf(fields, isinColumName);
        var marketValueDirtyColumnIndex = Array.IndexOf(fields, marketValueDirtyColumnName);

        if (walletColumnIndex == -1 || fundColomnIndex == -1 || isinColumnIndex == -1 ||
            marketValueDirtyColumnIndex == -1)
        {
            throw new ArgumentException("Eén of meerdere kolommen niet gevonden in " + importFile);
        }

        //TODO

        e.Result = importFile;     
    }

    private void _importWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        Progress = e.ProgressPercentage;
    }

    private void _importWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            Messenger.Default.Send(e.Error);
        }

        else if (e.Result != null)
        {
            PenultimateImportFileName = LastImportFileName;
            PenultimateImportDate = LastImportDate;               
            LastImportFileName = e.Result.ToString();
            LastImportDate = ImportDate;
            _dataContainer.UpdateImportSettings(_importSettings);
        }

        Progress = 100;
        IsBusy = false;
    }

When the exception is thrown, the backroundworker does not call e.Error, instead the application crashes. Is this normal and how to solve it? I read that E.Error is automaticlly called when an unhandled exception is thrown in the dowork.

This is how I call the backgroundworker:

_importWorker.RunWorkerAsync(new object[] {WalletColumnName, FundColumnName, IsinColumName, MarketValueDirtyColumnName, Seperator, s});

Edit

The debugger does break and throws the exception that I throw in the code:

System.ArgumentException was unhandled by user code
  HResult=-2147024809
  Message=Eén of meerdere kolommen niet gevonden in 021214-0.txt
  Source=Selection Monitoring Tool
  StackTrace:
       at Selection_Monitoring_Tool.ViewModels.SettingsViewModel._importWorker_DoWork(Object sender, DoWorkEventArgs e) in c:\Users\Joost\Desktop\Selection Monitoring Tool\Selection Monitoring Tool\ViewModels\SettingsViewModel.cs:line 216
       at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
       at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
  InnerException:
  • Is this your problem? http://stackoverflow.com/questions/258662/unhandled-exceptions-in-backgroundworker – Steve Jan 26 '15 at 09:58
  • Can you describe the "crash" ? Does the debugger breaks ? Is there a specific exception ? does it simply closes silently ? – Mickael V. Jan 26 '15 at 10:05
  • 2
    e.Error is a *property*, it doesn't get "called". If it "crashes" then you should be able to show us an exception message and a stack trace. Update your question with this essential info. After you checked the Debug + Exceptions dialog and made sure the Thrown checkboxes are turned off. – Hans Passant Jan 26 '15 at 10:35
  • @HansPassant the problem was the Thrown checkbox, I turned it off and it works. Thanks! – Joost van den Broek Jan 26 '15 at 11:58

1 Answers1

0

As @HansPassant suggested, I had to uncheck the "Break when this exception type is user unhandeled" checkbox.