iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >.NET跨线程控件的相关操作是什么
  • 889
分享到

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

2023-06-17 14:06:02 889人浏览 八月长安
摘要

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

.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跨线程控件的相关操作是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: .NET跨线程控件的相关操作是什么

本文链接: https://www.lsjlt.com/news/290089.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • .NET跨线程控件的相关操作是什么
    .NET跨线程控件的相关操作是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在.NET中,如果我们在非UI线程上访问窗体上的控件的时候,会产生一个跨线程调用的异常,那么...
    99+
    2023-06-17
  • C# winform跨线程操作控件的实现
    前提:当我们使用Winform开发的时候,经常会遇到:System.InvalidOperationException:“线程间操作无效: 从不是创建控件“x...
    99+
    2024-04-02
  • C# winform跨线程操作控件怎么实现
    今天小编给大家分享一下C# winform跨线程操作控件怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前提...
    99+
    2023-07-02
  • C#多线程的相关操作讲解
    一、线程异常 我们在单线程中,捕获异常可以使用try-catch,代码如下所示: using System; namespace MultithreadingOption { ...
    99+
    2024-04-02
  • 如何理解jQuery对相关控件的事件操作
    如何理解jQuery对相关控件的事件操作,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。今天突然对他的事件产生了兴趣,先前也碰到过,也没整理,今...
    99+
    2024-04-02
  • .Net Framework文本处理相关操作方法是怎样的
    本篇文章为大家展示了.Net Framework文本处理相关操作方法是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。.Net Framework开发环境帮助我们提供了一个功能非常强大的编写平台...
    99+
    2023-06-17
  • C#多线程相关操作的示例分析
    这篇文章主要介绍了C#多线程相关操作的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、线程异常我们在单线程中,捕获异常可以使用try-catch,代码如下所示:us...
    99+
    2023-06-29
  • .NET界面控件Essential Studio全线升级至2014 v3的操作过程
    .NET界面控件Essential Studio全线升级至2014 v3的操作过程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。好消息,界面控件 Essentia...
    99+
    2023-06-17
  • MongoDB管理用户的相关操作是什么
    这篇文章给大家介绍MongoDB管理用户的相关操作是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 列出所有用户mongouse admin ...
    99+
    2024-04-02
  • .NET Framework Lambda表达式的相关概念是什么
    这篇文章将为大家详细讲解有关.NET Framework Lambda表达式的相关概念是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。.NET Framework应用程序为我们提供了多种...
    99+
    2023-06-17
  • idea环境下分支操作相关命令是什么
    idea环境下分支操作相关命令是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。今天我们分析idea下分支操作相关命令以及分支创建与合并。1、idea 下分支操作相关命令...
    99+
    2023-06-03
  • 掌控线程管理:操作系统中的关键技巧
    线程管理是操作系统中一项至关重要的任务,它影响着系统的性能、可靠性和可扩展性。掌握线程管理技巧对于优化系统行为和确保可靠性至关重要。 线程管理的关键技巧 1. 线程同步 线程同步是确保多个线程访问共享数据时不会出现数据竞争和死锁的关键。常...
    99+
    2024-04-02
  • C#子线程的控件操作问题举例分析
    这篇文章主要介绍“C#子线程的控件操作问题举例分析”,在日常操作中,相信很多人在C#子线程的控件操作问题举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#子线程的控件操作问题举例分析”的疑惑有所帮助!...
    99+
    2023-06-17
  • .NET Framework隐式类型变量的相关概念是什么
    本篇文章给大家分享的是有关.NET Framework隐式类型变量的相关概念是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。.NET Framework中有一种新的特性,叫...
    99+
    2023-06-17
  • vnc远程控制软件,vnc远程控制软件有什么用,操作教程
    vnc远程控制软件让互联网插上了腾飞的翅膀,给工作生活带来了更多的可能。如何安装vnc远程控制软件并操作远程电脑呢?下面小编为大家呈上vnc远程控制软件教程,保证你一跃成为远程控制高手。  IIS7服务器管理工具————远程控制最...
    99+
    2023-06-04
  • Python连接在实际应用中的相关操作步骤是什么
    这篇文章给大家介绍Python连接在实际应用中的相关操作步骤是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在计算机语言中Python连接经常被使用的语言,说以需要大家努力的学习相关的知识与技能更好的了解Pytho...
    99+
    2023-06-17
  • Python嵌入C的相关操作方案是怎么样的
    本篇文章给大家分享的是有关Python嵌入C的相关操作方案是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Python在计算机语言中称得上是高一级的计算机语言,在实际的...
    99+
    2023-06-17
  • C语言文件的操作流程是什么
    这篇文章主要介绍“C语言文件的操作流程是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言文件的操作流程是什么”文章能帮助大家解决问题。为什么使用文件前面写的通讯录,增加人数退出程序后,数据就...
    99+
    2023-06-29
  • ASP.NET ImageButton控件的作用是什么
    ASP.NET ImageButton控件是一个可点击的图像按钮,用于在网页上触发事件或执行特定的操作。它可以显示一个图像,并且用户...
    99+
    2023-10-10
    ASP.NET
  • Java线程和操作系统的线程有什么区别
    这篇文章主要介绍了Java线程和操作系统的线程有什么区别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 用户空间和内核空间关于内核态和用户态我们在 了解操作系统的那些事儿...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作