//阻塞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他一直显示在那里程序里后面的代码是停止的不往后执行,但是主程序仍然会响应其他消