繁体   English   中英

从另一个线程中的事件开始的Form.show()

[英]Form.show() starting from event in another thread

我有一个在Form项目中触发事件的类。 触发事件的类中的方法在单独的线程中运行。 问题是如何从主线程(UI线程)加载表单?

namespace test
{
    public partial class Form1 : Form
    {
        Class1 cl1 = new Class1();
        static public Form2 f2 = new Form2();
        public Form1()
        {
            InitializeComponent();

            cl1.event1 += new Class1.del(CreateForm);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            cl1.Almog();
        }

        static public void CreateForm()
        {
            //Form2 f2 = new Form2();
                f2.Show();
        }
    }
} 

namespace ClassLibrary1
{
    public class Class1
    {
        public event del event1;
        public delegate void del();

        public void Almog ()
        {
            Thread t1 = new Thread(Print);
            t1.Name="class1";
            t1.Start();
        }
        public void Print ()
        {
            event1();
            while(true)
            {
                Console.WriteLine("in the loop");
            }
        }

    }

}

您需要使用MethodInvoker调用表单。 像这样...

           static public void CreateForm()
            {
              Form2 f2 = new Form2();
              f2.Invoke(new MethodInvoker(delegate()
              {

                    f2.Show();
              }));
            }

您需要检查是否需要调用方法调用。

static public void CreateForm() {
    Action action = () => { f2.Show(); };
    if (f2.InvokeRequired) {
        f2.Invoke(action);
    } else {
        action();
    }
}

如果您从另一个表单调用另一个表单,则将获得异常跨线程操作无效 为此,您需要调用方法调用。

static public void CreateForm()
{
   f2.Invoke(new MethodInvoker(delegate(){ f2.Show();}));
}

另外,请阅读以下内容以进一步澄清:

如何:对Windows窗体控件进行线程安全调用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM