使用Control.Invoke 方法对 Windows 窗体控件进行线程安全调用

@TOC在窗体应用的使用)Invoke(Delegate)在窗体应用的使用

多线程对Windows 窗体控件

多线程处理可以提高 Windows 窗体应用的性能,但对 Windows 窗体控件的访问本质上不是线程安全的。 多线程处理可以将你的代码公开给非常严重且复杂的 bug。 处理控件的两个或多个线程可能会强制控件处于不一致状态并导致争用情况、死锁和冻结或挂起。 如果在应用程序中实现多线程处理,请确保以线程安全的方式调用跨线程控件。 有关详细信息,请参阅托管线程处理最佳做法
可以通过两种方法从未创建该控件的线程安全调用 Windows 窗体控件。 您可以使用 System.Windows.Forms.Control.Invoke 方法调用在主线程中创建的委托,该委托又调用控件。 或者,您可以实现一个 System.ComponentModel.BackgroundWorker,该使用事件驱动模型将后台线程中完成的工作与报表上的结果进行分隔。

以下采用 Invoke(Delegate) 和 Invoke(Delegate, Object[])方法的样例程序

窗体界面

在这里插入图片描述

主程序

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
/*
The following example demonstrates the 'Invoke(Delegate)' method of 'Control class.
A 'ListBox' and a 'Button' control are added to a form, containing a delegate
which encapsulates a method that adds items to the listbox.This function is executed
on the thread that owns the underlying handle of the form. When user clicks on button
the above delegate is executed using 'Invoke' method.
   委托类似于 C 或C++语言中的函数指针。 委托封装对委托对象内的方法的引用。 然后,可以
将委托对象传递给调用所引用的方法的代码,在编译时要调用的方法可能是未知的。 与 C 或C++
中的函数指针不同,委托是面向对象的、类型安全且更安全。
   委托可以是 EventHandler的实例,在这种情况下,发送方参数将包含此控件,事件参数将包含
EventArgs.Empty。 委托还可以是 MethodInvoker的实例,也可以是使用 void 参数列表的任何其
他委托。 对 EventHandler 或 MethodInvoker 委托的调用将比调用另一个委托类型的速度更快。
*/
using System.Threading;
namespace MyFormControl
{
   
   public partial class MyFormControl : Form
{
   
        public delegate void AddListItem1();                //无参数
        public delegate void AddListItem2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值