c# - 同时运行两个任务
问题描述
嗨,我有一个 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}";
}
如果我直接调用该函数,它会更新标签,但如果我向它添加线程,则标签不会填充
解决方案
使用 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
推荐阅读
- python - 无法加载 jupyter 笔记本
- r-markdown - Rmarkdown 和 pandoc-2.5 & 2.6 的新错误(无法解码字节 \xa9)
- php - 从 PHP 执行 adb shell 并转义字符串
- sql - 在 sql 中聚合和计算百分比的优雅方法?
- java - 连接被拒绝,如何解决?
- python - 熊猫数据框:将列转换为单列的行
- c# - 最右边的点和图表边界之间的视觉差距
- twilio - Authy 自动短信验证
- javascript - 当我传递该元素的 xpath 时,专注于 web 元素的 Chrome 扩展
- asp.net - 在 IIS 10 中为 Asp.net 网站禁用客户端证书验证,但允许应用请求传入客户端证书