【发布时间】:2021-09-20 19:00:11
【问题描述】:
嗨,我有一个 winform 应用程序,它由 25 个文本框组成,这些文本框代表实时接收的值,而它们下方有标签,显示这些值的最小值和最大值flow in shown with red arrows
现在,当应用程序启动时,它会在每个文本框及其标签中填充数据,延迟为 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}";
}
如果我直接调用该函数,它会更新标签,但如果我向它添加线程,则标签不会填充
【问题讨论】:
-
空的
try..catches通常不好。您不应该使用非 GUI 线程来触摸 GUI 控件。需要调用这些调用。 -
您不能从非 UI 线程直接访问 UI 元素(任何 UI 元素,以任何方式)。如果您尝试,它可能会失败,您的应用程序可能会挂起,或者您可能会遇到异常(这取决于)。在 Windows 窗体中,所有控件(包括窗体(从
Control继承)都有一个属性InvokeRequired,如果您在非 UI 线程上,则该属性为 true,以及一个方法 (Invoke) 将封送您的调用到 UI 线程。看看@BojanB 和我对传统方式(在 WinForms 中)使用它的回答。 -
@adnan:你问了一个问题。你得到了三个答案。您对其中任何一个有任何疑问吗?他们中的任何一个有帮助吗?其中之一是否完美地回答了您的问题?我们付出了一些努力来帮助您。一些反馈,任何反馈,都会很有用
标签: c# multithreading winforms