c# - 在不阻塞主线程的情况下运行代码

标签 c# .net multithreading backgroundworker

我需要生成 n 个随机字符串,这个过程可能需要一段时间并阻塞主线程 UI。为了避免这种情况并让用户在进程运行时使用程序,我决定使用 backGroundWorker .但效果不佳,主线程仍然被阻塞。在我的 DoWork事件我有这样的事情:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
           // using Invoke because I change value of some controls, e.g,   ListView, labels and a progressbar
            this.Invoke((Action)delegate
            {
                for (int i = 0; i < nSteps; ++i)
                {
                    string s = getnStr();
                    // ...
                    int progress = (int)(100.0 / nSteps * (i + 1));
                    backgroundWorker1.ReportProgress(progress);
                }
            });
        }

即使我调用ReportProgress()在循环内部,进度条仅在循环完成时更改其值。

为什么会发生这种情况,我该如何解决?

最佳答案

Invoke... 这就是你弄错的地方。您只是创建了一个后台工作程序,以便将代码调用回主线程(这就是 Invoke 所做的)。

实际上,您应该只对控件访问使用调用,或者只在 ReportProgress 处理程序中修改控件,然后确保每次需要时都调用 ReportProgress 方法。

编辑:澄清:调用的问题是您正在为后台工作人员应该执行的整个工作负载调用 UI 线程。

关于c# - 在不阻塞主线程的情况下运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32160661/

相关文章:

c# - 程序在访问消息队列时挂起

java - Hazelcast 防止 JVM 终止

c# - MonoGame - BlendState - 2D SpriteBatch

c# - 如何在 Web 应用程序上运行后台服务 - DotNetNuke

java - .NET 系统加密到 Bouncy CaSTLe Java 解密抛出错误

c# - staticListInParentClass.OfType<DerivedType>?

c# - 有效文件名的正则表达式

C# Func<> 在库中委托(delegate)

c# - 如何使用 Roslyn 通过扩展方法、静态类中的方法和带有 ref/out 参数的方法访问调用

c# - 有什么方法可以读取/写入对象到.csv