线程中的Foreach错误

时间:2013-07-01 20:06:54

标签: c# multithreading winforms thread-safety

我有一个触发以下代码的计时器。如果是要显示的通知,我需要显示一个表单。问题是当在线程内部触发线程并且我设置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();

有什么想法吗? 谢谢大家。

2 个答案:

答案 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);
}