zoukankan      html  css  js  c++  java
  • winform 多线程中ShowDialog()模式窗口无效的解决办法

    前言

    比如如下代码

    private void Form1_Load(object sender, EventArgs e)
    {    
    	Thread thread = new Thread(Test);    
    	thread.IsBackground = true;    
    	thread.Start();
    }
    private void Test()
    {
    	Form2 form2 = new Form2();    
    	form2.ShowDialog();
    }

    form2的ShowDialog()显示并不是模式窗体,如何解决这种情况???

    解决方案

    线程中ShowDialogowner会变成null,需要重新指定

    Form2 form2 = new Form2(); 
    form2.ShowDialog(this);

    直接上面那样调用会出现问题,从不是创建某个控件的线程的其他线程调用该控件是不安全的,
    非UI线程访问控件需要使用委托。

    对 Windows 窗体控件进行线程安全调用,查询控件的 InvokeRequired 属性。

    1. 如果 InvokeRequired 返回 true,则使用实际调用控件的委托来调用 Invoke。
    2. 如果 InvokeRequired 返回 false,则直接调用控件。

    Form2增加xShowDialog成员函数,如下

    public delegate DialogResult InvokeDelegate(Form parent);
    public DialogResult xShowDialog(Form parent)
     {
         if (parent.InvokeRequired)
         {
             InvokeDelegate xShow = new InvokeDelegate(xShowDialog);
             parent.Invoke(xShow, new object[] { parent });
             return DialogResult;
         }
         return this.ShowDialog(parent);
     }

    在Form1类中这样调用:

    Form2 form2 = new Form2();
    form2.xShowDialog(this);

    出处:https://blog.csdn.net/achenyuan/article/details/86597538

    ====================================================================

    根据上面的思路,我自己写了一个ShowDialogX的方法,利用系统提供的Action或者Func实现方法的返回值,代码如下:

            public DialogResult ShowDialogX(Form parent)
            {
                if (parent.InvokeRequired)
                {
                    return (DialogResult)parent.Invoke(new Func<Form, DialogResult>(delegate { return ShowDialogX(parent); }), new object[] { parent });
                }
                return this.ShowDialog(parent);
            }
  • 相关阅读:
    springboot 无法访问静态资源
    webrtc源码阅读理解一
    c++ include的顺序重要吗?
    简说yuv
    i420 转 nv21
    ffmpeg mp4 转 yuv、 y4m转yuv、mp4转y4m && ffplay 播放y4m、yuv
    mysql 查询json字符串条件
    Webpack4.X中sourcemap的配置 详解
    webpack如何打包生成的map文件不生效?
    vue中使用setInterval,移入暂停,移出继续
  • 原文地址:https://www.cnblogs.com/mq0036/p/10796367.html
Copyright © 2011-2022 走看看