c# - Windows窗体中的线程

标签 c# winforms multithreading user-interface .net-4.0

我多年来一直在编写ASP.NET Web应用程序,但实际上并没有在大型Windows窗体项目上工作。现在,我需要进行一项工作,因此我正在寻找一些有关理想情况下如何构造大型Windows窗体项目的建议。更具体地说,我想知道如何处理多个线程。假设您有一个过程需要一些时间才能完成-您不想冻结ui窗口并且不响应。因此,该逻辑需要在单独的线程中移动。如果此线程访问UI,则将导致异常。调用似乎可以解决问题,但是编写和阅读起来非常丑陋和繁琐!

那么,实际上,最佳实践是什么?一个线程应该启动哪种类型的线程,以及如何在UI和逻辑之间拆分这些线程?有任何示例代码可以入门吗?

最佳答案

这是使用backgroundworker的一种简短方法

        public Form1()
    {
        InitializeComponent();

        BackgroundWorker worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true; //set to true to fire the progress-changed event
        worker.DoWork += doWork;
        worker.ProgressChanged += progressChanged;
    }

    void progressChanged(object sender, ProgressChangedEventArgs e)
    {
        int progress = e.ProgressPercentage; //Progress-Value
        object userState = e.UserState; //can be used to pass values to the progress-changed-event
    }

    void doWork(object sender, DoWorkEventArgs e)
    {
        object argument = e.Argument; //Parameters for the call
        bool cancel = e.Cancel; //Boolean-Value for cancel work
        object result = e.Result; //Object for a return-value
    }

关于c# - Windows窗体中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10991868/

相关文章:

c++ - 如何使用asio简化多线程设计?

c# - Entity Framework 、存储过程、返回多个临时表?

c# - 从带有索引的数组中获取前 3 个最高值

java - synchronized 在 Java 中是如何工作的

c# - HTMLAgilityPack 加载 AJAX 内容以进行抓取

mysql - 如何从 mysql 填充 datagridview 组合框 - vb.net

python - pyqt中标签随时间变化

c# - 可扩展的所有者界面

c# - 如何从数据表自动创建一个类

c# - 检测 PrintDocument 何时成功打印(不仅仅是预览)