隐藏由Windows窗体应用程序中的不同线程创建的窗体

时间:2016-06-02 22:02:37

标签: c# multithreading forms

我正在构建一个Windows应用程序,其中包含大约5个表单,并且我的应用程序超时,此时它会隐藏所有打开的表单并将其导航到Login表单。我有一个collection存储所有打开的表单,然后循环遍历collection并隐藏集合中列出的表单。

但是,我的一个表单由另一个线程调用,该线程抛出以下异常,这在尝试隐藏时很明显。

Cross-thread operation not valid: Control 'frmVerify' accessed from a thread other than the thread it was created on

我有以下代码试图隐藏所有活动表格

            try
            {
                string[] strFormCollections;
                Form objFRMMain = null;
                strFormCollections = new string[htFormCollections.Count];
                int intFormNumber = 0;

                IDictionaryEnumerator ideForms = htFormCollections.GetEnumerator();
                while(ideForms.MoveNext())
                {
                 objForm.Hide();    
                 }
            }
            catch(Exception ex)
            {
                DisplayMessage(ex);
            }

我尝试将objForm.Hide()替换为objForm.Invoke(new MethodInvoker(objForm.Hide));,但这一次投掷Collection was modified; enumeration operation may not execute

我可以知道更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我猜测当某个表单中的一个被隐藏导致集合发生变化时触发的事件就会被触发。您使用Invoke()方法是正确的,但您必须隐藏集合外枚举之外的表单。一个简单的方法是只收集.ToArray()集合:

foreach (var objForm in htFormCollections.ToArray())
    objForm.Invoke(new MethodInvoker(objForm.Hide));