C# 条件BackgroundWorker场景

C# 条件BackgroundWorker场景,c#,multithreading,backgroundworker,C#,Multithreading,Backgroundworker,我有一个GUI,它在主窗体的列表框中包含测试脚本列表。我想让BackgroundWorker根据从列表框中选择的项目执行不同的脚本 private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { if(listbox.SelectedItem.ToString() == test1) { testcase test1 = new testcase(); // instantiate the

我有一个GUI,它在主窗体的列表框中包含测试脚本列表。我想让
BackgroundWorker
根据从列表框中选择的项目执行不同的脚本

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
   if(listbox.SelectedItem.ToString() == test1)
   {
      testcase test1 = new testcase(); // instantiate the script
      test1.script1(); // run the code
   }
}

但是,当我尝试执行此操作时,由于我正在尝试跨线程操作,因此会收到
invalidoOperationException Occessed
消息。是否有其他方法来完成此任务?

您正在尝试从不同线程的UI元素中读取值。 这是不允许的。因此,您将获得
无效操作异常

UI元素由主(UI)线程拥有

为了从不同线程访问UI元素,您需要调用当前调度程序:

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    string selectedItem = "";
    this.Dispatcher.Invoke(new Action(() => 
    {
        selectedItem = listbox.SelectedItem.ToString();
    }

    if(selectedItem == test)
    {
        testcase test1 = new testcase(); // instantiate the script
        test1.script1(); // run the code
    }
}

请注意,当您调用dispatcher时,线程会同步以安全地跨线程获取值。您不想在dispatcher中调用完整的代码,因为这样它就不会再在不同的线程上执行了

您正在尝试从不同的线程读取UI元素的值。 这是不允许的。因此,您将获得
无效操作异常

UI元素由主(UI)线程拥有

为了从不同线程访问UI元素,您需要调用当前调度程序:

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    string selectedItem = "";
    this.Dispatcher.Invoke(new Action(() => 
    {
        selectedItem = listbox.SelectedItem.ToString();
    }

    if(selectedItem == test)
    {
        testcase test1 = new testcase(); // instantiate the script
        test1.script1(); // run the code
    }
}

请注意,当您调用dispatcher时,线程会同步以安全地跨线程获取值。您不想在dispatcher中调用完整的代码,因为这样它就不会再在其他线程上执行了

在调用后台工作程序之前将数据传递到后台线程

bw.RunWorkerAsync(listbox.SelectedItem.ToString());
...
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    string selectedItem = (string)e.Argument;

    if(selectedItem == test)
    {
        testcase test1 = new testcase(); // instantiate the script
        test1.script1(); // run the code
    }

}

在调用后台工作人员之前,将数据传递到后台线程

bw.RunWorkerAsync(listbox.SelectedItem.ToString());
...
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    string selectedItem = (string)e.Argument;

    if(selectedItem == test)
    {
        testcase test1 = new testcase(); // instantiate the script
        test1.script1(); // run the code
    }

}

我只能得到
这个。调用
@nevets你在WPF还是Winforms上?两者的语法略有不同。概念是sameI只能得到
这个。调用
@nevets你是在WPF还是Winforms上?两者的语法略有不同。概念是一样的