C#中 BackGroundWorker与Thread的区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中 BackGroundWorker与Thread的区别?相关的知识,希望对你有一定的参考价值。

在我编写的一个程序中创建500个Thread后,程序垮掉。然而创建500个BackGroundWorker后,程序就能正常运行。这是为什么呢?

使用Thread ,在多线程编程中经常需要在线程间共享资源。例如,多个线程可能需要访问一个共享数据库,或对一组系统变量进行更新。当多个线程同时竞争共享资源的访问权时,就可能会出现“争用状态”。您可以通过使用“锁”来保护代码的关键部分免受争用状态的损坏。当然这需要通过细致的手动编码来实现.

在.NET Framework 2.0中 BackgroundWorker 组件取代了 System.Threading 命名空间并添加了功能,简化了面向用户的编码难度,可以很好的帮你处理多线程间的调度,保护等方面的问题,通过提供面向对象的线程模型来使您能够快速、方便地创建多线程应用程序。

对于对线程开发, 需要注意:是否使用lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断,是否及时的创建和终止线程,是否使用线程池来管理每一个线程,此外,简单的创建及销毁线程的测试程序是不足以说明该技术的实际应用的.
参考技术A BackgroundWorker对线程的访问提供了一种安全的方式。对Thread的一次封装。用于在单独的线程上运行操作。
Thread 用于线程的创建和控制的类。
参考技术B 可能是你用 Thread的时候没有注意 死锁等问题 参考技术C 因为你写的有问题 参考技术D 当用户执行一个非常耗时的操作时,如果不借助Thread编程,用户就会感觉界面反映很迟钝。在.Net 2.0中可以通过BackgroundWork非常方便地进行Thread编程,大致的步骤是:
1、调用BackgroundWorker的RunWorkerAsync方法(可以传递参数),它将调用DoWork事件
2、在DoWork的事件响应代码中调用耗时的操作,此例中是PingIPs函数
3、在耗时操作中判断CancellationPending属性,如果为false则退出
4、如果要向用户界面发送信息,则调用BackgroundWorker的ReportProgress方法,它将调用ProgressChanged事件(可以将改变通过object类型传递)
5、在ProgressChanged事件的响应代码中将改变呈现给用户
6、如果需要取消耗时操作,则调用BackgroundWorker的CancelAsync方法,需要和步骤3一起使用

参考资料:Baidu

本回答被提问者和网友采纳

以上是关于C#中 BackGroundWorker与Thread的区别?的主要内容,如果未能解决你的问题,请参考以下文章

C# backgroundworker使用方法

(C#) BackgroundWorker() ProgressChanged 不工作

C# BackGroundWorker backgroundWorker1_DoWork中,按钮不能按的问题

C# BackgroundWorker 详解

C# BackgroundWorker 详解

C# BackgroundWorker 详解