我知道如何对用户控件执行线程安全调用,但是当它们动态生成时我没有线索。我尝试制作它们的数组列表(富文本框),之后我遇到了'参数启动线程'委托的问题。非常感谢您的投入。
private void SetText(string text)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (this.currentBox.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke( d, new object[] { text } );
}
else
{
this.currentBox.Text += text;
}
}
// This method is executed on the worker thread and makes
// a thread-safe call on the TextBox control. On a specific text box.....
private void ThreadProcSafe()
{
int i = 0;
while(_stop_threads == false) {
this.SetText(String.Format("{0}\n", i));
++i;
Thread.Sleep(100);
}
this.SetText(String.Format("Thread Time: {0}:{1}:{2}\n", DateTime.Now.TimeOfDay.Hours, DateTime.Now.TimeOfDay.Minutes, DateTime.Now.TimeOfDay.Seconds));
}
答案 0 :(得分:1)
问题是,虽然每个UI控件都有一个单独的线程,但该窗体在单个线程下工作。因此,从单独的线程更新UI控件是不安全的。
也许您可以从这些线程填充字典或数组,并在Form的单线程下更新该数组的结果。这样,您将从更新的值数组中同时更新所有UI控件。它是线程安全的,并且它消耗更少的系统资源。