C# 条件BackgroundWorker场景
我有一个GUI,它在主窗体的列表框中包含测试脚本列表。我想让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
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上?两者的语法略有不同。概念是一样的