//阻塞UI线程及消息循环 AutoResetEvent autoResetEvent = new AutoResetEvent(false); Task.Factory.StartNew(() => { Form form = new Form(); form.TopLevel = true; form.TopMost = true; form.Show(); // MessageBox.Show( "MessageBox显示窗口在最上层了吗?", "系统提示", MessageBoxButtons.OK , MessageBoxIcon.None , MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification); Thread.Sleep(10000); form.Close(); autoResetEvent.Set(); autoResetEvent.WaitOne(); 方式2(可以不容UI继续操作,UI消息循环还不阻塞) //自定义对话框(showdialog不阻塞UI线程和消息循环只是不允许界面操作) class MessageShow static Form_Message form = null; ........................ //异步逻辑处创建并显示 MessageShow.form.ShowDialog(parent); //主界面关闭 MessageShow. form.Close(); Task.Factory.StartNew(() => { Task.Factory.StartNew(()=>{ Form form = new Form(); form.TopLevel = true; form.TopMost = true; form.ShowDialog(); Thread.Sleep(10000); ...............................//找到Form句柄然后关闭 form.Close();
 public delegate DialogResult InvokeDelegate(Form parent);
        int a = 0;
        public DialogResult MyShowDialog(Form parent)
            if (parent.InvokeRequired)
                InvokeDelegate myShow = new InvokeDelegate(MyShowDialog);
               object ob= parent.Invoke(xShowmyShow, new object[] { parent });
                DialogResult res =  (DialogResult)(ob);
               return res;
            return this.ShowDialog(parent);
  MessageBox.Show(this, "..", "..", MessageBoxButtons.OK, MessageBoxIcon.Information);
本文实例讲述了C#WPF使用多线程调用窗体组件的方法。分享给大家供大家参考。具体如下: Thread thread=new Thread(new ThreadStart(TestThread)); thread.Start(); private void TestThread() for (int i = 0; i < 11 xss=removed> { this.listBox1.Items.Add(this is a test!!!); } 最近敲代码发现一个问题,C#自带的MessageBox.show()弹框,默认是模态对话框,是阻塞线程的,也就是说你不点击弹框上的按钮,它就会一直显示在那里,MessageBox.show()后面的代码是停止的不往后执行,但是程序仍然会响应其他消息,比如Timer事件,造成时序逻辑混乱,会一直弹窗出来。方法的使用方法是,你传递一个委托(和任何需要的参数)给它,然后它将这个委托排入UI线程的事件队列。它用于在控件的拥有线程上异步执行指定的委托,无论这个方法是从哪个线程调用的。 开发Winform程序的时,经常会用到等待窗口(如网络通讯、数据库操作等一些耗时操作),这样可以可以有更好的体验。     本例程等待窗口可以传入显示的问题动态更新显示的文字内容,添加了窗口句柄方法,可以在线程操作,解决模态窗口ShowDialog()时不起作用还能继续操作地步控件的问题。 另外添加了近百种loading加载gif动图显示,可满足各种需求。 把MessageBox.Show交给线程去处理就可以了public void ShowMessage(string msg) this.Dispatcher.Invoke(new MessageBoxShow(MessageBoxShow_F), new object[] { msg }); delegate vo 在使用Winform开发的过程,不可避免的要使用多线程,其会在多线程会调用窗口的ShowDialog方法,但实际上并不是模式窗口。 private void Form1_Load(object sender, EventArgs e) Thread thread = new Thread(remind); thread.IsBackground = ... ShowDialog后,调用异步,await还未等异步线程执行完毕,弹窗关闭了 问题描述: ShowDialog弹出了一个Form,然后在form有点击button执行一个异步调用接口查询操作,等待查询结束后再做其他判断,结果异步还未执行完毕,form就执行了dispose关闭了。 原因:最终确定原因是在调用异步前面设置了DialogResult的值。当设置了DialogResult的值后,窗体将自动关闭,该逻辑在底层默认执行。此时,用await等待异步执行时,并没有占用线程,然后窗体就关了。 我一开始以为这个MessageBox跟Delphi里面的ShowMessage是一样的,程序里可以随便放,因为C#里面就TM这一个封装好的弹出对话框提示消息函数,可以直接用的。 结果实习做程序测试被坑爹了,发现我错了,C#这个MessageBox默认是模态对话框,是阻塞的,也就是说你不区点击okNOCancel他一直显示在那里程序里后面的代码是停止的不往后执行,但是程序仍然会响应其他消