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

时间:2014-06-18 10:04:31

标签: c# multithreading events invoke

我有一个在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");
            }
        }

    }

}

3 个答案:

答案 0 :(得分:0)

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

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

                    f2.Show();
              }));
            }

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

另外,请阅读此内容以获得进一步说明:

  

How to: Make Thread-Safe Calls to Windows Forms Controls