• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#关于多线程之线程中窗体之间的控件值调用

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

本周做了一个线程中打开多个窗体的东西,父窗体打开子窗体,父窗体获取子窗体的控件值,此处我在打开窗体时,分别在不同的线程中打开的,不做多考虑,上手就做,到后来程序崩掉了,原因是什么了,找不到对应的控件,这是为什么了,因为创建子窗体的过程和创建父窗体的过程并不在同一线程中,程序无法获知你要找的控件,那么对于这种情况,就得用到vs自带的Control.InvokeRequired方法,此方法返回的结果为bool类型,主要是“ 获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。”   

关于Invoke()方法,传递参数为一个方法委托,它采用的参数的数量和类型与 args 参数中所包含的相同。摘要: 在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托。

详例说明

           //第一步:打开窗体
            SendEmailProgress  progress = new SendEmailProgress();
            progress.Closing += (s, ev) =>
                {
                    if (progress.IsEnabledCloseForm)
                    {
                        progress.IsAlreadyClosed = true;
                        TaxCardFactory.ReleaseCard();
                    }
                    else
                    {
                        ev.Cancel = true;
                        CommonClass.Message("323", "", null);
                    }

                };
            
             Control.CheckForIllegalCrossThreadCalls = false; //在这个类中我们不检查跨线程的调用是否合法
             thread = new Thread(new ParameterizedThreadStart(ShowCommonProgressFormDialog));
             thread.Start();
             SendEmailProgress.TaxCardInfo info = progress.GetCardInfo("AutoExtract", taxCardModel);

SendEmailProgress.cs文件 错误的代码:        
public TaxCardInfo GetCardInfo(string type, ITaxCard card)    {     using (EditTaxCardPwd editTaxCardForm=new EditTaxCardPwd(type,card)) {    if (editTaxCardForm.ShowDialog(this) != DialogResult.OK)    {    return null;    }    return new TaxCardInfo()    { CardPwd = editTaxCardForm.goldenPlatePwd    };    }    } 正确的代码:       public TaxCardInfo GetCardInfo(string type, ITaxCard card) {   if (InvokeRequired) {   return this.Invoke(new Func<string, ITaxCard,TaxCardInfo>(GetCardInfo),type,card) as TaxCardInfo;
//这种写法等同于定义一个委托方法,比如:   
//private delegate void GetCardInfoHandler(string type, ITaxCard card);
//GetCardInfoHandler InfoHandler=GetCardInfo; return this.Invoke(GetCardInfoHandler,new object[]{type,card});   }   
using (EditTaxCardPwd editTaxCardForm=new EditTaxCardPwd(type,card))    {   if (editTaxCardForm.ShowDialog(this) != DialogResult.OK)    {    return null;    }    return new TaxCardInfo()    {    CardPwd = editTaxCardForm.goldenPlatePwd    };   }   }

同时,需要注意的是如果线程中打开某个窗体,并且要为打开的窗体附加样式,一定要确保加载样式的逻辑和打开窗体的逻辑在同一个线程里!!!!!

此文仅做个人积累。。。。。。。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#aspx页面动态加载ascx用户控件及利用反射调用其发布时间:2022-07-14
下一篇:
c#Settings.settings设置发布时间:2022-07-14
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap