Как запустить BackGroundWorker, а также добавить текст в элемент управления RichTextBox от делегата, который получает значения из родительской формы в C # - PullRequest
0 голосов
/ 26 марта 2019

У меня есть родительская форма, которая отправляет таблицу данных в дочернюю форму от Delegate. Делегат выполнен, и я также получил стол на стороне ребенка. я хочу добавить текст в свой элемент управления richtextbox, чтобы объявить пользователю, что происходит, а затем запустить фонового работника. но я получаю STAThread Exception. я знаю кое-что об Invoke (Delegate) и об однопоточности, но я не знаю, как мне преодолеть эту многопоточность. Любая помощь приветствуется.

Коды из Appent To RichTextBox не выполняются при отладке (я знаю, что это возможно при запуске файла * .exe).
// Что я делаю и пытаюсь: (SetDaTableAndFileNameFn - мой полученный делегат)

 public void SetDaTableAndFileNameFn(System.Data.DataTable DataTable)
    {
        //Test The Parent Has Sent And Child Has Received.
        MessageBox.Show("Ruger Parent...");
        dt.Clear();
        dt = DataTable;
        //Check whether My dt Filled Correctly.
        MessageBox.Show(dt.Rows[2][2].ToString());
        richTxtBxExprtr.AppendText(">>> Creating And Transferring Data To The File...");
        //BGWorker.
        bGWExprtrLod.WorkerReportsProgress = true;
        bGWExprtrLod.RunWorkerAsync();
    }

 private void ExportToTxtIrrigularly(System.Data.DataTable DataTable)
    {
    // Using Microsoft.Office.Interop.Word.Application to export datatable.
    }

  private void xBtnExprt_Click(object sender, EventArgs e)
    {
        SaveFileDialog svFDialXls = new SaveFileDialog();
        svFDialXls.Filter = "Plain text(*.txt)| *.txt";
        svFDialXls.Title = "Export Data As Text";
        svFDialXls.InitialDirectory = @"Desktop";
        if (svFDialXls.ShowDialog() == DialogResult.OK && svFDialXls.FileName != null)
        {
            WordFilePath = svFDialXls.FileName.ToString();
   //Fire An EventHandler In The Parent Side To Fill A datatable With A DGV.
            ExportImport ExportTxFile = new ExportImport(allRowsExprt, fRowTEndExprt, fRowTEndValExprt, FTRowExprt,
                FTRowValFExprt, FTRowValTExprt, allFieldsExprt, visFieldExprt, slctdFieldExprt);
            OnExportTxFile(ExportTxFile);
 //Filled datatable Will Send Back from parent side with  theSetDaTableAndFileNameFn 
        }
    }

    private void bGWExprtrLod_DoWork(object sender, DoWorkEventArgs e)
    {
        this.Invoke(new Action(() =>
        {
            richTxtBxExprtr.AppendText(">>> Start Processing...\n>>> Copying Data Take A Little Time.\n>>> Be Patient...\n>>> Loadind Data...\n-----------------------------------------------\n");
            ExportToTxtIrrigularly(dt);
        }));
    }

 private void bGWExprtrLod_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
            this.Invoke(new Action(() =>{richTxtBxExprtr.AppendText(">>> Line NO. [" + e.ProgressPercentage.ToString() + "]  Is In Progress...\n");
                richTxtBxExprtr.ScrollToCaret();
            }));
    }

    private void bGWExprtrLod_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {this.Invoke(new Action(() => { richTxtBxExprtr.AppendText(">>> The Process Is Completed Successfuly.\n"); }));
    }

выполненный mthod в BGWorker откроет сохраненный журнал () и затем экспортирует мою таблицу данных в текстовый формат, используя
Microsoft.Office.Interop.Word.Application

1 Ответ

0 голосов
/ 26 марта 2019

Не совсем уверен, какая у вас настройка, но она будет выглядеть примерно так:

private BackgroundWorker bGWExprtrLod;

private void Form1_Load(object sender, EventArgs e)
{
    bGWExprtrLod = new BackgroundWorker();
    bGWExprtrLod.WorkerReportsProgress = true;
    bGWExprtrLod.ProgressChanged += BGWExprtrLod_ProgressChanged;
    bGWExprtrLod.RunWorkerCompleted += BGWExprtrLod_RunWorkerCompleted;
    bGWExprtrLod.DoWork += BGWExprtrLod_DoWork;
}

public void SetDaTableAndFileNameFn(System.Data.DataTable DataTable)
{
    // ... other code ...
    bGWExprtrLod.RunWorkerAsync();
}

private void BGWExprtrLod_DoWork(object sender, DoWorkEventArgs e)
{
    bGWExprtrLod.ReportProgress(0, ">>> Creating And Transferring Data To The File...");
    // ... do some work ...
}
private void BGWExprtrLod_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    string msg = e.UserState.ToString();
    richTxtBxExprtr.AppendText(msg);
}

private void BGWExprtrLod_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    richTxtBxExprtr.AppendText("Transfer Complete!");
}

** РЕДАКТИРОВАТЬ **

Начните с перемещения вызова на васметод экспорта вне вызова Invoke ():

private void bGWExprtrLod_DoWork(object sender, DoWorkEventArgs e)
{
    this.Invoke(new Action(() =>
    {
        richTxtBxExprtr.AppendText(">>> Start Processing...\n>>> Copying Data Take A Little Time.\n>>> Be Patient...\n>>> Loadind Data...\n-----------------------------------------------\n");
    }));
    ExportToTxtIrrigularly(dt);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...