Как обойти код в событии RunWorkerCompleted, если происходит ошибка? - PullRequest
0 голосов
/ 03 ноября 2018

Я написал программу, которая создает файл XML из содержимого электронной таблицы Excel. Программа работает, и теперь я делаю ее более надежной, добавив проверку ошибок. Например, если электронная таблица Excel не содержит обязательный тег XML, программа отобразит ошибку и вернется из основной программы. При возникновении ошибки происходит событие RunWorkerCompleted (), и выполняется код, который не должен выполняться из-за возникновения ошибки. У меня вопрос, как определить, произошла ли ошибка, чтобы я мог обойти определенный код в событии RunWorkerCompleted ().

Я пытался вызвать bgw.CancelAsync () в основной программе, где обнаружена ошибка, но RunWorkerCompletedEventArgs e.Cancelled имеет значение false, поэтому он не работает.

Вот некоторые выдержки из моего кода. Индикатор выполнения запускается в событии нажатия кнопки. Это работает, но я должен был объявить cellProcessed, rowCount и colCount глобальными, потому что я не мог понять, как передать их в bgw_DoWork ().

private void button_create_Click(object sender, EventArgs e)
{
   // Define the event that fires when the progress bar finishes
   bgw.RunWorkerCompleted += bgw_Complete;

        rowCount = xmlRange.Rows.Count; // Declared as global
        colCount = xmlRange.Columns.Count;  // Declared as global

        // Start the progress bar thread
        if (!bgw.IsBusy)
        {
            bgw.RunWorkerAsync();
        }

        // Read the header in row 1 and return an error if it isn't valid
        for (colIdx = 1; colIdx <= colCount; colIdx++)
        {
            if ((xmlRange.Cells[1, colIdx] != null) && (xmlRange.Cells[1, colIdx].Value2 != null))
            {
                cellContents = xmlRange.Cells[1, colIdx].Value2.ToString();

                switch (colIdx)
                {
                    case 1:
                        if (cellContents != "Tag")
                        {
                            error = true;
                            errText = "Cell A1 must contain 'Tag'";
                        }
                        break;
                    case 2:
                        if (cellContents != "Type")
                        {
                            error = true;
                            errText = "Cell B1 must contain 'Type'";
                        }
                        break;
   if (error)
   {

      bgw.CancelAsync();
      MessageBox.Show(errText, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

      // Close Excel resources
      xmlWorkbook.Close();
      xmlSpreadsheet.Quit();
      Marshal.ReleaseComObject(xmlRange);
      Marshal.ReleaseComObject(xmlWorksheet);
      Marshal.ReleaseComObject(xmlWorkbook);
      Marshal.ReleaseComObject(xmlSpreadsheet);
      GC.Collect();

      return;
   }

    private void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        if (bgw.CancellationPending)
        {
            e.Cancel = true;
        }
        else
        {
            label_pctComplete.Text = "Completed " + progressBar.Value.ToString() + "%";
            bgw.ReportProgress((100 * ++cellsProcessed) / (rowCount * colCount));
        }
    }

    private void bgw_Complete(object sender, RunWorkerCompletedEventArgs e)
    {
        if (!e.Cancelled)
        {
            label_pctComplete.Visible = false;
            progressBar.Visible = false;

            // Inform the user that the XML file was created
            label_created.Visible = true;
            label_created.Text = "Done!...Created " + textBox_outputFile.Text;

            // Enable the button so the user can view the XML Limit File
            button_openLimitFile.Enabled = true;
        }
    }

    private void bgwProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar.Value = e.ProgressPercentage;
    }

Спасибо за любую помощь.

...