服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#中backgroundworker的使用教程

C#中backgroundworker的使用教程

2022-02-23 13:30秋漓 C#

这篇文章主要介绍了C#中backgroundworker的使用教程,在文中有两点需要注意的,大家可以看下

介绍:

根据msdn介绍:

         backgroundworker 类允许您在单独的专用线程上运行操作。 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (ui) 似乎处于停止响应状态。 如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 backgroundworker 类方便地解决问题。

       若要在后台执行耗时的操作,请创建一个 backgroundworker,侦听那些报告操作进度并在操作完成时发出信号的事件。 可以通过编程方式创建 backgroundworker,也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。 如果在 windows 窗体设计器中创建 backgroundworker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。

       若要为后台操作做好准备,请添加 dowork 事件的事件处理程序。 在此事件处理程序中调用耗时的操作。 若要开始此操作,请调用 runworkerasync。 若要收到进度更新的通知,请处理 progresschanged 事件。 若要在操作完成时收到通知,请处理 runworkercompleted 事件。

有2点需要注意的:

   1、由于dowork事件内部的代码运行在非ui线程之上,确保在 dowork 事件处理程序中不操作任何用户界面对象。 而应该通过 progresschanged 和 runworkercompleted 事件与用户界面进行通信。

   2、backgroundworker 事件不跨 appdomain 边界进行封送处理。 请不要使用 backgroundworker 组件在多个 appdomain 中执行多线程操作。

使用:

运行显示:

C#中backgroundworker的使用教程

1、声明一个backgroundworker

?
1
backgroundworker backgroundworker1 = null;

2、初始化backgroundworker,设置属性并绑定事件

?
1
2
3
4
5
6
7
8
9
10
11
public form1()
{
 initializecomponent();
 backgroundworker1 = new backgroundworker();
 backgroundworker1.workerreportsprogress = true;//能否报告进度更新。
 backgroundworker1.workersupportscancellation = true;//是否支持异步取消
 //绑定事件
 backgroundworker1.dowork += new doworkeventhandler(backgroundworker1_dowork);
 backgroundworker1.progresschanged += new progresschangedeventhandler(backgroundworker1_progresschanged);
 backgroundworker1.runworkercompleted += new runworkercompletedeventhandler(backgroundworker1_runworkercompleted);
}

3、backgroundworker事件

dowork事件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private void backgroundworker1_dowork(object sender, system.componentmodel.doworkeventargs e)
 //句柄sender指向的就是该backgroundworker。
 
 //e.argument 获取异步操作参数的值
 //e.cancel 是否应该取消事件
 //e.result 获取或设置异步操作结果的值(在runworkercompleted事件可能会使用到)
 object a = e.argument;//获取runworkerasync(object argument)传入的值
 backgroundworker worker = sender as backgroundworker;
    
 for (int i = 1; i <= 10; i++)
 {
  if (worker.cancellationpending == true)//在耗时操作中判断cancellationpending属性,如果为false则退出
  {
   e.cancel = true;
   break;
  }
  else
  {
   // perform a time consuming operation and report progress.
   system.threading.thread.sleep(500);
   worker.reportprogress(i * 10, "object userstate");// 将触发backgroundworker.progresschanged事件,向progresschanged报告进度
  }
 }
 e.result = "结束";
}

runworkercompleted事件:当dowork事件处理完成之后,将会触发该事件。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void backgroundworker1_runworkercompleted(object sender, system.componentmodel.runworkercompletedeventargs e)
{
 //e.cancelled指示异步操作是否已被取消
 //e.error 指示异步操作期间发生的错误
 //e.result 获取异步操作结果的值,即dowork事件中,result设置的值。
 if (e.cancelled == true)
 {
  resultlabel.text = "canceled!";
 }
 else if (e.error != null)
 {
  resultlabel.text = "error: " + e.error.message;
 }
 else
 {
  resultlabel.text = e.result.tostring();
 }
}

progresschanged事件:progresschanged事件处理程序的第二个参数e有一个progresspercentage属性,它就由 reportprogress的第一个参数percentprogress来提供。这个参数一般用来报告该后台操作完成的进度,然后用progresschanged的第二个参数e的progresspercentage属性来获取该进度信息。如果用户还想传递更多的信息,可以使用reportprogress的第二种重载,它的第二个参数userstate将会传递给progresschanged事件的参数e的userstate属性。

?
1
2
3
4
5
6
private void backgroundworker1_progresschanged(object sender, system.componentmodel.progresschangedeventargs e)
{
 //e.progresspercentage 获取异步操作进度的百分比
 resultlabel.text = (e.progresspercentage.tostring() + "%");
 string state = (string)e.userstate;//接收reportprogress方法传递过来的userstate
}

4、按钮事件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//开始按钮
private void btnstart_click(object sender, eventargs e)
{
 if (backgroundworker1.isbusy != true)//判断backgroundworker 是否正在运行异步操作。
 {
  // start the asynchronous operation.
  backgroundworker1.runworkerasync("object argument");//启动异步操作,有两种重载。将触发backgroundworker.dowork事件
 }
}
 //终止
private void btnend_click(object sender, eventargs e)
{
 if (backgroundworker1.workersupportscancellation == true)
 {
  // cancel the asynchronous operation.
  backgroundworker1.cancelasync(); //请求取消挂起的后台操作。调用该方法将使backgroundworker.cancellationpending属性设置为true。
 }
}

总结

以上所述是小编给大家介绍的c#中backgroundworker的使用教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:https://blog.csdn.net/qq_33459369/article/details/80019685

延伸 · 阅读

精彩推荐
  • C#C#微信公众号与订阅号接口开发示例代码

    C#微信公众号与订阅号接口开发示例代码

    这篇文章主要介绍了C#微信公众号与订阅号接口开发示例代码,结合实例形式简单分析了C#针对微信接口的调用与处理技巧,需要的朋友可以参考下...

    smartsmile20127762021-11-25
  • C#VS2012 程序打包部署图文详解

    VS2012 程序打包部署图文详解

    VS2012虽然没有集成打包工具,但它为我们提供了下载的端口,需要我们手动安装一个插件InstallShield。网上有很多第三方的打包工具,但为什么偏要使用微软...

    张信秀7712021-12-15
  • C#C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    这篇文章主要介绍了C#设计模式之Strategy策略模式解决007大破密码危机问题,简单描述了策略模式的定义并结合加密解密算法实例分析了C#策略模式的具体使用...

    GhostRider10972022-01-21
  • C#深入理解C#的数组

    深入理解C#的数组

    本篇文章主要介绍了C#的数组,数组是一种数据结构,详细的介绍了数组的声明和访问等,有兴趣的可以了解一下。...

    佳园9492021-12-10
  • C#三十分钟快速掌握C# 6.0知识点

    三十分钟快速掌握C# 6.0知识点

    这篇文章主要介绍了C# 6.0的相关知识点,文中介绍的非常详细,通过这篇文字可以让大家在三十分钟内快速的掌握C# 6.0,需要的朋友可以参考借鉴,下面来...

    雨夜潇湘8272021-12-28
  • C#利用C#实现网络爬虫

    利用C#实现网络爬虫

    这篇文章主要介绍了利用C#实现网络爬虫,完整的介绍了C#实现网络爬虫详细过程,感兴趣的小伙伴们可以参考一下...

    C#教程网11852021-11-16
  • C#SQLite在C#中的安装与操作技巧

    SQLite在C#中的安装与操作技巧

    SQLite,是一款轻型的数据库,用于本地的数据储存。其优点有很多,下面通过本文给大家介绍SQLite在C#中的安装与操作技巧,感兴趣的的朋友参考下吧...

    蓝曈魅11162022-01-20
  • C#如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    这篇文章主要给大家介绍了关于如何使用C#将Tensorflow训练的.pb文件用在生产环境的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴...

    bbird201811792022-03-05