我的编程空间,编程开发者的网络收藏夹
学习永远不晚

.NET跨线程控件的相关操作是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

.NET跨线程控件的相关操作是什么

.NET跨线程控件的相关操作是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

在.NET中,如果我们在非UI线程上访问窗体上的控件的时候,会产生一个跨线程调用的异常,那么如何处理这种情况呢?我介绍了使用Control.Invoke方法,如果你不习惯使用委托,那么.Net还为我们提供了一个组件BackgroundWorker,你可以使用这个组件,以事件的方式去处理这种跨线程的控件访问。下面我就来详细的介绍一下这个组件的用法。

我们先来看一下BackgroundWorker提供了哪些常用的成员,

事件

◆DoWork:我们在这个事件中,执行需要异步处理的工作。

◆ProgressChanged:我们在这个事件中,接收并处理异步处理过程中的信息。

◆RunWorkerCompleted:我们在这个事件中,执行异步处理结束的工作。

方法

◆RunWorkerAsync()和RunWorkerAsync(object argument):这两个方法触发DoWork事件,开始异步操作。

◆ReportProgress(int percentProgress)和ReportProgress(int percentProgress, object userState):这两个方法触发ProgressChanged事件。

◆CancelAsync:结束后台的异步操作。

属性

◆bool CancellationPending:指示当前的后台的异步操作是否正在被取消,执行CancelAsync方法会导致这个属性为true。

◆bool IsBusy:指示当前的后台异步操作是否正在进行,进行中为true。

◆bool WorkerReportsProgress:获取或设置当前的BackgroundWorker是否可以执行ProgressChanged方法。

◆bool WorkerSupportsCancellation:获取或设置当前的BackgroundWorker是否可以执行CancelAsync方法。

OK,有了上面这些成员,我们来看一下BackgroundWorker是如何工作的。

Step 1. 当然是定义一个BackgroundWorker的实例,你可以从工具箱中拖拽一个BackgroundWorker控件到窗体上或者在代码中直接声明;

Step 2. 生成DoWork事件并在DoWork事件的中添加需要异步执行的代码。在异步执行的代码中,如果需要处理界面中的控件,请调用ReportProgress方法,而不要直接处理(例如给控件赋值),因为DoWork事件跟正常的界面的事件不同,这个事件在非UI线程上执行,所以才能异步执行。

Step 3. 生成ProgressChanged事件并添加控件处理的代码,因为这个事件是在UI线程上执行的,所以可以给界面中的控件进行赋值等操作。

Step 4. 如果需要,请生成RunWorkerCompleted事件,在此处理异步执行结束的业务逻辑。当然,此事件也是在UI线程上执行的,可以给界面中的控件进行赋值等操作。

Step 5. 在需要执行异步操作的地方调用RunWorkerAsync方法,开始执行异步调用。

下面是具体的代码:

public Form1()      {        InitializeComponent();         bWorker.DoWork += new DoWorkEventHandler(bWorker_DoWork);         bWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bWorker_RunWorkerCompleted);        bWorker.ProgressChanged += new ProgressChangedEventHandler(bWorker_ProgressChanged);        this.Text = "UI thread id is:" + Thread.CurrentThread.ManagedThreadId.ToString();      }     BackgroundWorker bWorker = new BackgroundWorker();    void bWorker_DoWork(object sender, DoWorkEventArgs e)     {     int tick = (int)e.Argument;      Thread thr = Thread.CurrentThread;     for (int i = 0; i < 30; i++)      {        if (bWorker.CancellationPending)         {            e.Cancel = true;              //break;       }     else        {               Thread.Sleep(TimeSpan.FromSeconds(tick));              bWorker.ReportProgress(i, DateTime.Now.ToString() + "\\TID:" + thr.ManagedThreadId.ToString());          }        }            }   void bWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)     {    progressBar1.Value = e.ProgressPercentage;       label1.Text = e.UserState.ToString();    }    void bWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)   {     label1.Text = DateTime.Now.ToString();        progressBar1.Value = progressBar1.Maximum;         if (e.Cancelled)     label1.Text = "User cancelled.";    }    private void btnInvoke_Click(object sender, EventArgs e)   {     bWorker.WorkerReportsProgress = true;       bWorker.WorkerSupportsCancellation = true;        if (!bWorker.IsBusy)        bWorker.RunWorkerAsync(1);    }   private void btnCancel_Click(object sender, EventArgs e)     {        if (bWorker.WorkerSupportsCancellation)           bWorker.CancelAsync();    }

上面的代码请注意几个地方:

第50行,开始调用RunWorkerAsync方法前,请先判断IsBusy属性是否是false,因为如果为true,则说明上一次的调用还没有结束,再次调用会引发异常。

第56行,调用CancelAsync方法前,请先设置WorkerSupportsCancellation属性为true,否则会引发异常。

第26行,调用ReportProgress方法前,请先设置WorkerReportsProgress属性为true,否则会引发异常。

RunWorkerAsync方法传递的参数是object类型,这个参数的值可以在DoWork事件的参数e中的属性Argument获得。

ReportProgress方法传递的参数可以在事件ProgressChanged中的参数e中获得。

调用CancelAsync方法只是向后台的异步线程发出结束申请,具体什么时候结束,由线程自动管理。

在RunWorkerCompleted事件中,如果想知道后台任务是正常执行完毕还是被调用CancelAsync方法强制中断,请参考事件的参数e的Cancelled属性。(奇怪的是这个属性不会在你调用CancelAsync方法后自动设置为true,你需要象代码中的20行那样进行设置。)

请注意第7行和第26行的代码,这两段代码中的线程的ID,说明了DoWork事件和UI是在两个不同的线程上执行。

实际上BackgroundWorker并非直接用来解决跨线程的控件调用的问题,只是它提供了一种工作机制,可以让你的程序利用它来执行异步调用,并且在异步调用的过程中进行控件的操作。

关于.NET跨线程控件的相关操作是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

.NET跨线程控件的相关操作是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

.NET跨线程控件的相关操作是什么

.NET跨线程控件的相关操作是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在.NET中,如果我们在非UI线程上访问窗体上的控件的时候,会产生一个跨线程调用的异常,那么
2023-06-17

C# winform跨线程操作控件怎么实现

今天小编给大家分享一下C# winform跨线程操作控件怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前提:当我们使
2023-07-02

.NET界面控件Essential Studio全线升级至2014 v3的操作过程

.NET界面控件Essential Studio全线升级至2014 v3的操作过程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。好消息,界面控件 Essential Stu
2023-06-17

Python连接在实际应用中的相关操作步骤是什么

这篇文章给大家介绍Python连接在实际应用中的相关操作步骤是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在计算机语言中Python连接经常被使用的语言,说以需要大家努力的学习相关的知识与技能更好的了解Pytho
2023-06-17

C语言文件的操作流程是什么

这篇文章主要介绍“C语言文件的操作流程是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言文件的操作流程是什么”文章能帮助大家解决问题。为什么使用文件前面写的通讯录,增加人数退出程序后,数据就
2023-06-29

vc控制台程序关闭事件时的处理方式是什么

本篇内容介绍了“vc控制台程序关闭事件时的处理方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!关键控制台API函数:SetConso
2023-06-21

数据库周刊28│开发者最喜爱的数据库是什么?阿里云脱口秀聊程序员转型;MySQL update误操作;PG流复制踩坑;PG异机归档;MySQL架构选型;Oracle技能表;Oracle文件损坏处理……

墨天轮数据库周刊第28期发布啦,每周1次推送本周数据库相关热门资讯、精选文章、干货文档。本周分享 开发者最喜爱的数据库是什么?阿里云脱口秀爆聊程序员转型;MySQL update误操作后进行数据库恢复;PG流复制踩坑;PG异机归档;MySQL架构选型案例;or
数据库周刊28│开发者最喜爱的数据库是什么?阿里云脱口秀聊程序员转型;MySQL update误操作;PG流复制踩坑;PG异机归档;MySQL架构选型;Oracle技能表;Oracle文件损坏处理……
2014-10-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录