0

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

任何想法?谢谢大家。

4

2 回答 2

3

您正在尝试拥有多个 UI 线程,除此之外,您的第二个 UI 线程既不是 STA 线程也不是前台线程(两者都是问题),最后,根据您的错误,您似乎正在从不正确的 UI 线程。

只是不要这样做。只使用一个 UI 线程并在其中完成所有工作。

不要启动后台线程来运行这些表单,将它们全部显示在您已经拥有的 UI 线程中。如果您想确保一次只显示一个表单,请使用ShowDialog,并且如果您希望同时显示和激活多个表单,请Show改用。

于 2013-07-01T20:12:59.867 回答
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);
}
于 2013-07-02T22:25:49.820 回答