好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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 中执行多线程操作。

使用:

运行显示:

1、声明一个backgroundworker

?

backgroundworker backgroundworker1 = null ;

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

?

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事件

?

private void backgroundworker1_dowork( object sender, system测试数据ponentmodel.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事件处理完成之后,将会触发该事件。

?

private void backgroundworker1_runworkercompleted( object sender, system测试数据ponentmodel.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属性。

?

private void backgroundworker1_progresschanged( object sender, system测试数据ponentmodel.progresschangedeventargs e)

{

  //e.progresspercentage 获取异步操作进度的百分比

  resultlabel.text = (e.progresspercentage.tostring() + "%" );

  string state = ( string )e.userstate; //接收reportprogress方法传递过来的userstate

}

4、按钮事件

?

//开始按钮

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

dy("nrwz");

查看更多关于C#中backgroundworker的使用教程的详细内容...

  阅读:51次