我有一个触发以下代码的计时器。如果是要显示的通知,我需要显示一个表单。问题是当在线程内部触发线程并且我设置ConfiguracioGlobal.DicNotices[kvp.Key].Shown = true;
时,下一次运行不知道.Shown
是真的。在显示表单时,我收到以下错误:Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on.
我想我必须使用委托但我不知道:(
System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(delegate
{
try
{
foreach (KeyValuePair<int, Notice> kvp in GlobalConfiguration.DicNotices)
{
if (!kvp.Value.Shown && DateTime.Now.Hour == kvp.Value.HourIni.Hour && DateTime.Now.Minute == kvp.Value.HourIni.Minute)
{
GlobalConfiguration.DicNotices[kvp.Key].Shown = true;
FrmNotices frmPopup = new FrmNotices(kvp.Key);
frmPopup.Show();
Application.Run(frmPopup);
}
}
}
catch (Exception ex)
{
MessageBox.Show("Error");
}
}));
thread.IsBackground = true;
thread.Start();
有什么想法吗? 谢谢大家。
答案 0 :(得分:3)
您正在尝试拥有多个UI线程,除此之外,您的第二个UI线程既不是STA线程也不是前台线程(两者都是问题),最后,根据您的错误,您似乎正在访问来自不正确的UI线程的控件。
不要这样做。只使用一个UI线程并从中完成所有工作。
不要启动后台线程来运行这些表单,将它们全部显示在您已有的UI线程中。如果您想确保一次只显示一个表单,请使用ShowDialog
,如果您希望同时显示并激活多个表单,请改用Show
。
答案 1 :(得分:0)
只要它们是STA线程,理论上你可以拥有任意数量的:
for(var i = 0; i < 4; i++)
{
var t = new Thread((s) =>
{
Application.Run(
new Form
{
Text = s.ToString()
});
});
t.IsBackground = true;
t.SetApartmentState(ApartmentState.STA);
t.Start(i);
}