Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#-拒绝为另一个班级做任何事情的幕后工作者_C#_Class_Backgroundworker - Fatal编程技术网

c#-拒绝为另一个班级做任何事情的幕后工作者

c#-拒绝为另一个班级做任何事情的幕后工作者,c#,class,backgroundworker,C#,Class,Backgroundworker,我有一个WPF C#项目,具有以下按钮单击事件无效: public void ButtonClick(object sender, RoutedEventArgs e) { _worker.WorkerReportsProgress = true; _worker.DoWork += (o, ea) => {

我有一个WPF C#项目,具有以下按钮单击事件无效:

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
,并将
设置为
do
testvalue=2
。然后在
RunWorkerCompleted
事件处理程序中,确保
\u class1.testvalue
等于2。