e4r*_*dog 1 c# multithreading winforms
这是使用显示一段时间的状态消息的最佳方式吗?
private void SetStatus(Color _color, string _msg)
{
System.Threading.Thread t = new System.Threading.Thread(() =>
{
stsStatusMsg.ForeColor = _color;
stsStatusMsg.Text = _msg;
System.Threading.Thread.Sleep(2000);
stsStatusMsg.Text = "";
});
t.Start();
}
Run Code Online (Sandbox Code Playgroud)
调用它的示例:
SetStatus(Color.Red, AppMessages["msgALREADYIN"]);
Run Code Online (Sandbox Code Playgroud)
stsStatusMsgToolStripStatusLabel在整个应用程序操作期间,只能通过此方法访问(即a ).
上面的代码实际上有效.消息显示在控件上2秒钟然后消失......
如果这是在WinForms中,我怀疑,这不太可行.您只能从主窗口消息线程访问UI控件,可以通过Invoke在控件上使用来访问它.更新,虽然您的代码确实有效,但这是因为您从线程操作的实际对象不是Control- 通常在WinForms中,不允许跨线程访问.
此外,每个状态的新线程似乎有点过分.是的,线程将在某些时候由GC处理,但是线程是一种昂贵的资源,而且您的代码会为每个状态更改创建一个.更好的方法是使用内置线程池(在框架管理的池中从长期存在的线程获取处理时间),或者使用a Timer,它用于以指定的时间间隔运行代码.
如何更改文本,然后使用计时器在所需的时间后再次隐藏它?
这是一个使用以下的解决方案Timer:
private void SetStatus(Color _color, string _msg)
{
stsStatusMsg.ForeColor = _color;
stsStatusMsg.Text = _msg;
timer.Start();
}
private void StatusTimer_Elapsed(object sender, EventArgs e)
{
stsStatusMsg.Text = "";
timer.Stop();
}
Run Code Online (Sandbox Code Playgroud)
上面的代码假定计时器已经构建,并且它的Tick事件已连接到StatusTimer_Elapsed事件.System.Windows.Forms.Timer该类非常适合这种情况的原因是在UI线程上引发了timer事件,这意味着您不必担心对控件的跨线程访问.
免责声明:我只是在不使用编译器的情况下想到了上面的示例,可能需要进行调整.
| 归档时间: |
|
| 查看次数: |
2072 次 |
| 最近记录: |