c#-拒绝为另一个班级做任何事情的幕后工作者
我有一个WPF C#项目,具有以下按钮单击事件无效:c#-拒绝为另一个班级做任何事情的幕后工作者,c#,class,backgroundworker,C#,Class,Backgroundworker,我有一个WPF C#项目,具有以下按钮单击事件无效: public void ButtonClick(object sender, RoutedEventArgs e) { _worker.WorkerReportsProgress = true; _worker.DoWork += (o, ea) => {
public void ButtonClick(object sender, RoutedEventArgs e)
{
_worker.WorkerReportsProgress = true;
_worker.DoWork += (o, ea) =>
{
try
{
_class1.hithere();
}
catch (Exception exception)
{
MessageBox.Show(exception.Message);
}
};
_worker.ProgressChanged += (o, ea) =>
{
};
_worker.RunWorkerCompleted += (o, ea) =>
{
MessageBox.Show("Done");
};
_worker.RunWorkerAsync();
}
我在应用程序中有一个名为InformationProviders的文件夹,其中包含Class1.cs文件,我已经使用MyApplication.InformationProviders实现了正确的语句
我还正确地声明了backgroundworker DoWork事件中调用的Class1类:
readonly Class1 _class1 = new Class1();
cs文件包含以下代码,这些代码只是为了查看它是否工作,但不幸的是,它没有工作:
public class Class1
{
public void hithere()
{
MessageBox.Show("Hi, I'm working.");
}
}
我在这里错过了什么????我声明该类为公共类,并且(我相信)声明了使该过程正常工作所需声明的所有内容
它所做的只是显示一条消息,说“完成”,这意味着它已经完成了backgroundworker流程(尽管它根本没有做DowWork事件中所述的任何事情。因此,启动worker并立即认为它已完成
问候和感谢
Simon关于运行多线程应用程序,这里有一个棘手的问题:只有一个线程可以访问UI并对其执行操作
对于您的代码,其后台操作中的backgroundworker
尝试使用MessageBox
显示消息。这不起作用-它没有在UI线程上被“激发”
如果您必须从BackgroundWorker
内部执行UI操作(您不应该这样做-这就是ProgressChanged
事件的目的),那么您可以使用Dispatcher
类
下面是一个简短的例子:
private void Button_Click(object sender, RoutedEventArgs e)
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (s, a) =>
{
this.Dispatcher.Invoke(new Action(() => MessageBox.Show("doing stuff")));
};
bw.RunWorkerCompleted += (s, a) =>
{
MessageBox.Show("done");
};
bw.RunWorkerAsync();
}
另一个有趣的事实是,如果您使用Dispatcher.Invoke
(如上所述),那么“做事情”将首先出现,如果您使用Dispatcher.BeginInvoke
,那么“完成”将首先出现,因为其他操作将在UI线程上排队
下面是使用BackgroundWorker
的“政治正确”方法:
bw.WorkerReportsProgress = true;
bw.DoWork += (s, a) =>
{
bw.ReportProgress(0, "doing stuff");
};
bw.ProgressChanged += (s, a) =>
{
MessageBox.Show(a.UserState as String);
};
运行多线程应用程序有一个棘手的问题:只有一个线程可以访问UI并对其执行操作
对于您的代码,其后台操作中的backgroundworker
尝试使用MessageBox
显示消息。这不起作用-它没有在UI线程上被“激发”
如果您必须从BackgroundWorker
内部执行UI操作(您不应该这样做-这就是ProgressChanged
事件的目的),那么您可以使用Dispatcher
类
下面是一个简短的例子:
private void Button_Click(object sender, RoutedEventArgs e)
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (s, a) =>
{
this.Dispatcher.Invoke(new Action(() => MessageBox.Show("doing stuff")));
};
bw.RunWorkerCompleted += (s, a) =>
{
MessageBox.Show("done");
};
bw.RunWorkerAsync();
}
另一个有趣的事实是,如果您使用Dispatcher.Invoke
(如上所述),那么“做事情”将首先出现,如果您使用Dispatcher.BeginInvoke
,那么“完成”将首先出现,因为其他操作将在UI线程上排队
下面是使用BackgroundWorker
的“政治正确”方法:
bw.WorkerReportsProgress = true;
bw.DoWork += (s, a) =>
{
bw.ReportProgress(0, "doing stuff");
};
bw.ProgressChanged += (s, a) =>
{
MessageBox.Show(a.UserState as String);
};
我发现了问题,我使用的是MessageBox的xeed.WPF.toolkit版本,它只是拒绝在backgroundWorker中显示该UI元素。感谢您的帮助,尽管它为我指明了正确的方向。希望这能帮助其他人。我发现了问题,我使用的是MessageBox的xeed.WPF.toolkit版本,并且只是拒绝在backgroundWorker中显示该UI元素。感谢您的帮助,尽管它为我指明了正确的方向。希望这能帮助其他人
正在非主UI线程的线程上执行UI工作。相反,出于测试目的,请添加一个字段,例如public int testvalue=0
,并使执行testvalue=2
。然后在RunWorkerCompleted
事件处理程序中,确保\u class1.testvalue
等于2,Class1.heree()
正在非主UI线程的线程上执行UI工作。相反,出于测试目的,请添加一个字段,例如public int testvalue=0
,并将设置为dotestvalue=2
。然后在RunWorkerCompleted
事件处理程序中,确保\u class1.testvalue
等于2。