首页 > 解决方案 > 同时运行两个任务

问题描述

嗨,我有一个 winform 应用程序,它由 25 个文本框组成,这些文本框代表实时接收的值,而它们下面有标签,显示这些值的最小最大值和平均值,用红色箭头显示

现在,当应用程序启动时,它会在每个文本框及其标签中填充数据,延迟为 1 秒。因此,它需要 7 到 8 秒才能完全填充数据。

我想要的是将填充文本框和标签的任务分为两部分。

我尝试使用它进行多线程处理,但它对我不起作用

到目前为止我的代码

        Thread mmathread;
        while (start)
        {
            try
            {
                RPM_TEXT.Text = ReadRPM().ToString() + " rpm";
                mmathread = new Thread(() => mma(rpm_list, ReadRPM(), RPM_mma));
                mmathread.Start();
                
            }
            catch { }

            try { EL_TEXT.Text = ReadEngineLoad().ToString() + " %";
                mmathread = new Thread(() => mma(el_list, ReadEngineLoad(), EL_mma));
                mmathread.Start();
                
            }
            catch { }
            try { ECT_TEXT.Text = ReadCoolantTemp().ToString() + " °C";
                mmathread = new Thread(() => mma(ect_list, ReadCoolantTemp(), ECT_mma));
                mmathread.Start();
                }
            catch { }
            }

函数定义为

private void mma(List<int> parameter_list, int parameter, Label label)
            {
            if (parameter_list.Count == 9) { parameter_list.Add(parameter); 
            parameter_list.RemoveAt(0); }
            else { parameter_list.Add(parameter); }
            minpara = parameter_list.Min();
            maxpara = parameter_list.Max();
            avrgpara = parameter_list.Sum() / parameter_list.Count;

            label.Text = $"Min = {minpara}, Avg = {avrgpara}, Max = {maxpara}";
            }

如果我直接调用该函数,它会更新标签,但如果我向它添加线程,则标签不会填充

标签: c#multithreadingwinforms

解决方案


使用 Threads 时,您需要在标签上使用 Invoke。像这样

 label.Invoke((MethodInvoker) delegate () {label.Text = $"Min = {minpara}, Avg = {avrgpara}, Max = {maxpara}"};

https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.invoke?view=net-5.0


推荐阅读