无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型

本文探讨了在多线程环境下,由于跨线程修改主线程窗口控件的限制,需要使用Invoke方法。解释了Invoke的工作原理,即在控件创建线程上执行委托内的方法,避免并发问题。文章指出,原始代码通过声明委托类型、创建方法和实例化委托的方式显得冗余。作者通过示例代码说明,直接使用Lambda表达式创建匿名方法和委托实例时,由于缺乏明确的委托类型定义,导致编译错误。解决方案是使用内置委托如Action或Func。
摘要由CSDN通过智能技术生成

看了些博客,感觉还是没说清楚,下面说说自己的理解。

在多线程环境下是不允许跨线程修改主线程上窗口控件的,所以在子线程中对控件进行修改应该使用控件的Invoke方法,Invoke方法的定义是在拥有此控件的基础窗口句柄的线程上执行指定的委托。也就是说它会自动寻找创建该控件的线程(一般是主线程),然后在该线程上执行委托里的方法,这就避免了多线程同时操作同一控件,使其状态不确定。窗体本身也具有这个方法,所以如果怕麻烦的话,可以统一用this.Invoke。

言归正传,先贴上一个正确的代码:

        delegate void ShowMessageDelegate(string mes);
        private void show(string mes)
        {
            richTextBox1.AppendText(mes);
        }
        internal void ShowMessage(string message)
        {
            ShowMessageDelegate deg = show;
            richTextBox1.Invoke(deg, message);
        }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值