C#-如何从另一个类中的线程更新主UI

颜色

我实际上在学习(艰难的方式)C#,并为问题困扰了好几天:

我正在用WPF(dotNet 4.0)编写我的第一个C#应用程序。当我单击按钮时,将使用BackgroundWorker线程并从外部类调用方法,这样我的UI不会冻结->我的方法按预期运行。

然后,我尝试从外部类更新ListView控件以获取某种进度(文本),但不幸的是失败了。

我知道我需要使用委托和调度程序来更新我的控件。

我尝试使用此处提供的解决方案:如何从另一个类中运行的另一个线程更新UI(由于声望低,我无法对此发表评论),而且我错过了拼图的某些部分。

什么YourEventArgs(状态)是指什么?当我的方法在BGW中运行时,我只是没有办法触发事件并将内容传递回我的UI。

到目前为止,我有这段代码(从answer更新):

namespace AppMain
{
    public partial class MainWindow
    {
        BackgroundWorker AppWorker = new BackgroundWorker();

        public MainWindow()
        {
            InitializeComponent();

            AppWorker.WorkerSupportsCancellation = true;
            AppWorker.DoWork += AppWorker_DoWork;
            AppWorker.RunWorkerCompleted += AppWorker_RunWorkerCompleted;
            }

        private void btnLoad_Click(object sender, RoutedEventArgs e)
        {
            lstTest.Items.Add("Processing data...");
            AppWorker.RunWorkerAsync();
        }

        public void AppWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            SetXmlData xml = new SetXmlData();
            xml.ProgressUpdate += (s, evt) =>
            {
                Dispatcher.BeginInvoke((Action)(() =>
                {
                    lstTest.Items.Add("this is a test : " + evt.myData); //how to retrieve the myData property from evt ?
                }));
            };
            xml.FlushData();
        }

        public void AppWorker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
        {
            if (!(e.Cancelled))
            {
                lstTest.Items.Add("Done");
            }
            else
            {
                MessageBox.Show("Cancelled");
            }
        }
}
}

SetXmlData.cs

namespace AppMain
{
    public class SetXmlData
    {
    public event EventHandler ProgressUpdate;

        //update method
        public void update(object input)
        {
        if (ProgressUpdate != null)
        ProgressUpdate(this, new YourEventArgs { myData = (string)input });
        }

        //calculation method
        public void FlushData()
        {
            MessageBox.Show("this is a test !");
            update("test");
        }
    }

    public class YourEventArgs : EventArgs
    {
        public string myData { get; set; }
    }
}

谢谢你的帮助。

新人镇

您可以简单地ProgressUpdateFlushData()方法中调用事件

只需致电:

If (ProgressUpdate !=null )
{
    ProgressUpdate(this,new YourEventArgs())
}

this是源实例的来源实例event

您可以通过从EventArgs继承来创建YourEventArgs

  public class YourEventArgs : EventArgs
  {
     //Put any property that you want to pass back to UI here.
  }

event在UI中引发时:

RaiseEvent.ProgressUpdate += (s, e) =>
        {
            Dispatcher.BeginInvoke((Action)(() => 
                                        { 
                                            lstTest.Items.Add("this is a test : "); 
                                            //Add items to your UI control here...
                                        }));
        };

e将为类型YourEventArgs

顺便提一句,您永远不要触摸其他线程(例如您的示例中的背景工作线程)中的UI线程。由于您event-handler已经执行过Dispatcher.BeginInvoke,所以很安全。

同样,您的ProgressUpdate事件应该在类SetXmlData中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C#线程在另一个类中启动

来自分类Dev

如何在C#中访问另一个类中某个类的私有函数?

来自分类Dev

如何在C#中的另一个线程上运行的循环中更新文本框

来自分类Dev

在C#中“导入”另一个类

来自分类Dev

如何从C#中的另一个非UI线程更新文本标签

来自分类Dev

如何获取一个类对象以在C#中存储另一个类对象?

来自分类Dev

如何从C#中的另一个线程在主线程中设置变量?

来自分类Dev

C#如何从另一个类访问静态类List <>

来自分类Dev

通知线程停止-在另一个线程和类中引发事件-C#

来自分类Dev

如何从C#中的另一个类调用函数

来自分类Dev

如何初始化另一个C#类中的类中的列表以填充列表

来自分类Dev

如何在C#中从另一个私有类调用私有类变量

来自分类Dev

在Unity / C#中,.Net的async / await是否确实从另一个线程开始?

来自分类Dev

如何使用另一个类(C#)中的变量实现搜索功能?

来自分类Dev

C#:使用线程从另一个类更新表单属性

来自分类Dev

如何将一个类访问另一个C#类

来自分类Dev

C#/ WPF从另一个类中创建的另一个线程更新UI

来自分类Dev

C#在另一个类中创建类

来自分类Dev

C#打印另一个类的列表

来自分类Dev

如何阻塞线程,直到另一个线程在C#中获得服务器响应

来自分类Dev

如何从C#中的另一个线程在主线程中设置变量?

来自分类Dev

如何使用继承从C#中的另一个类进行调用和对象

来自分类Dev

C#与另一个类中的一个类的变量进行交互

来自分类Dev

从另一个类 C# 更新标签不起作用

来自分类Dev

从另一个线程更新 UI c++ Windows Form 应用程序

来自分类Dev

如何在另一个类 C# Windows Forms 中引用一个类

来自分类Dev

如何在C#中的另一个方法中调用同一类中的方法?

来自分类Dev

C#中另一个类的对象

来自分类Dev

在 C# 中的另一个类列表中添加类列表

Related 相关文章

  1. 1

    C#线程在另一个类中启动

  2. 2

    如何在C#中访问另一个类中某个类的私有函数?

  3. 3

    如何在C#中的另一个线程上运行的循环中更新文本框

  4. 4

    在C#中“导入”另一个类

  5. 5

    如何从C#中的另一个非UI线程更新文本标签

  6. 6

    如何获取一个类对象以在C#中存储另一个类对象?

  7. 7

    如何从C#中的另一个线程在主线程中设置变量?

  8. 8

    C#如何从另一个类访问静态类List <>

  9. 9

    通知线程停止-在另一个线程和类中引发事件-C#

  10. 10

    如何从C#中的另一个类调用函数

  11. 11

    如何初始化另一个C#类中的类中的列表以填充列表

  12. 12

    如何在C#中从另一个私有类调用私有类变量

  13. 13

    在Unity / C#中,.Net的async / await是否确实从另一个线程开始?

  14. 14

    如何使用另一个类(C#)中的变量实现搜索功能?

  15. 15

    C#:使用线程从另一个类更新表单属性

  16. 16

    如何将一个类访问另一个C#类

  17. 17

    C#/ WPF从另一个类中创建的另一个线程更新UI

  18. 18

    C#在另一个类中创建类

  19. 19

    C#打印另一个类的列表

  20. 20

    如何阻塞线程,直到另一个线程在C#中获得服务器响应

  21. 21

    如何从C#中的另一个线程在主线程中设置变量?

  22. 22

    如何使用继承从C#中的另一个类进行调用和对象

  23. 23

    C#与另一个类中的一个类的变量进行交互

  24. 24

    从另一个类 C# 更新标签不起作用

  25. 25

    从另一个线程更新 UI c++ Windows Form 应用程序

  26. 26

    如何在另一个类 C# Windows Forms 中引用一个类

  27. 27

    如何在C#中的另一个方法中调用同一类中的方法?

  28. 28

    C#中另一个类的对象

  29. 29

    在 C# 中的另一个类列表中添加类列表

热门标签

归档