许多经常执行的操作可能需要很长的执行时间。例如:
-
图像下载
-
Web 服务调用
-
文件下载和上载(包括点对点应用程序)
-
复杂的本地计算
-
数据库事务
-
本地磁盘访问(相对于内存访问来说其速度很慢)
类似这样的操作可能导致用户界面在操作运行时挂起。如果您需要用户界面的响应却遇到与此类操作关联的长时间延迟,BackgroundWorker 组件可以提供一种方便的解决方案。
使用 BackgroundWorker 组件,您可以在不同于应用程序的主用户界面线程的另一线程上异步(“在后台”)执行耗时的操作。若要使用 BackgroundWorker,只需要告诉该组件要在后台执行的耗时的辅助方法,然后调用 RunWorkerAsync 方法。在辅助方法以异步方式运行的同时,您的调用线程继续正常运行。该方法运行完毕,BackgroundWorker 激发 RunWorkerCompleted 事件(可选择包含操作结果)向调用线程发出警报。
“组件”选项卡的“工具箱”中提供了 BackgroundWorker 组件。若要向窗体添加 BackgroundWorker,请将 BackgroundWorker 组件拖到窗体上。该组件出现在组件栏中,该组件的属性出现在“属性”窗口中。
若要启动异步操作,请使用 RunWorkerAsync 方法。RunWorkerAsync 采用一个可选的 object 参数,可以使用该参数将变量传递给辅助方法。BackgroundWorker 类公开 DoWork 事件,您的辅助线程通过 DoWork 事件处理程序附加到该事件。
DoWork 事件处理程序采用一个 DoWorkEventArgs 参数,该参数具有 Argument 属性。此属性接收来自 RunWorkerAsync 的参数,并可以传递至 DoWork 事件处理程序中调用的辅助方法。下面的示例演示如何分配名为 ComputeFibonacci 的辅助方法的结果。该示例摘自如何:实现使用后台操作的窗体中一个较大的示例。
' This event handler is where the actual work is done.
Private Sub backgroundWorker1_DoWork( _
ByVal sender As Object, _
ByVal e As DoWorkEventArgs) _
Handles backgroundWorker1.DoWork
' Get the BackgroundWorker object that raised this event.
Dim worker As BackgroundWorker = _
CType(sender, BackgroundWorker)
' Assign the result of the computation
' to the Result property of the DoWorkEventArgs
' object. This is will be available to the
' RunWorkerCompleted eventhandler.
e.Result = ComputeFibonacci(e.Argument, worker, e)
End Sub 'backgroundWorker1_DoWork
// This event handler is where the actual,
// potentially time-consuming work is done.
private void backgroundWorker1_DoWork(object sender,
DoWorkEventArgs e)
{
// Get the BackgroundWorker that raised this event.
BackgroundWorker worker = sender as BackgroundWorker;
// Assign the result of the computation
// to the Result property of the DoWorkEventArgs
// object. This is will be available to the
// RunWorkerCompleted eventhandler.
e.Result = ComputeFibonacci((int)e.Argument, worker, e);
}
// This event handler is where the actual,
// potentially time-consuming work is done.
void backgroundWorker1_DoWork( Object^ sender, DoWorkEventArgs^ e )
{
// Get the BackgroundWorker that raised this event.
BackgroundWorker^ worker = dynamic_cast<BackgroundWorker^>(sender);
// Assign the result of the computation
// to the Result property of the DoWorkEventArgs
// object. This is will be available to the
// RunWorkerCompleted eventhandler.
e->Result = ComputeFibonacci( safe_cast<Int32>(e->Argument), worker, e );
}
// This event handler is where the actual,
// potentially time-consuming work is done.
private void backgroundWorker1_DoWork(Object sender, DoWorkEventArgs e)
{
// Get the BackgroundWorker that raised this event.
BackgroundWorker worker = (BackgroundWorker)sender;
// Assign the result of the computation
// to the Result property of the DoWorkEventArgs
// object. This is will be available to the
// RunWorkerCompleted eventhandler.
e.set_Result(new Long(ComputeFibonacci(System.Convert.ToInt32
(e.get_Argument()), worker, e)));
//e.Result = ComputeFibonacci((int)e.Argument, worker, e);
} //backgroundWorker1_DoWork
有关使用事件处理程序的更多信息,请参见事件和委托。
警告
使用任何一种多线程都可能引起极为严重和复杂的 bug。在实现任何一种使用多线程处理的解决方案之前,请先参考托管线程处理的最佳做法。
|
有关使用 BackgroundWorker 类的更多信息,请参见如何:在后台运行操作。
分享到:
相关推荐
`BackgroundWorker`控件是.NET框架中用于执行耗时操作的一个重要组件,它允许应用程序在不阻塞用户界面(UI)线程的情况下运行后台任务。这个控件在Windows Forms应用程序中特别常见,确保UI始终保持响应,提升用户...
**BackgroundWorker组件:** `BackgroundWorker` 是 .NET Framework 中的一个控件,设计用于在UI线程之外执行耗时操作,这样可以避免长时间运行的任务导致用户界面无响应。它提供了事件驱动的异步模式,包含 `DoWork...
* 多线程编程:使用 BackgroundWorker 组件进行多线程编程。 Windows Forms 实战项目 * 创建简单的计算器应用程序。 * 创建基于数据库的数据管理系统。 * 创建多用户聊天应用程序。 通过学习《在实战中成长...
C#中,我们可以利用`StreamReader`类来读取文本文件,同时使用`BackgroundWorker`组件来实现异步处理,避免阻塞用户界面。以下是一个简单的步骤概述: 1. **创建UI元素**:在用户界面上添加一个进度条控件(`...
10. 多线程:WinForm支持多线程编程,可以使用BackgroundWorker组件实现后台任务,避免阻塞UI线程。 在"MJ.HP.UI"这个压缩包文件中,很可能包含了一个名为"MJ.HP.UI"的项目或库,该项目可能用于构建一个特定的...
.NET框架提供了多种多线程解决方案,如Thread类、BackgroundWorker组件以及TPL(Task Parallel Library)等,可以帮助开发者轻松实现后台任务的管理与控制。 ##### 2.4 高级布局管理 除了基本的FlowLayoutPanel、...
使用BackgroundWorker组件或async/await关键字,可以在后台执行耗时操作,而不阻塞用户界面。 8. 高级特性:深入学习如对话框(如OpenFileDialog和SaveFileDialog)、打印支持、自定义控件、异常处理、多线程和网络...
3. **使用BackgroundWorker组件**:对于需要长时间运行的任务,使用`BackgroundWorker`是一个不错的选择。它可以轻松地将耗时的任务放到后台线程,并在完成后安全地更新UI。 4. **使用Task和async/await**:现代C#...
例如,在进行大数据量的数据库操作时,可以使用BackgroundWorker组件来避免UI冻结。 9. **用户权限管理**:为了保护敏感数据,系统可能需要实现用户登录和权限验证。VB提供了对话框控件来获取用户输入,同时需要...
- **BackgroundWorker**: `BackgroundWorker` 类是.NET Framework中的一个组件,可以方便地在后台线程中执行耗时操作,并将结果返回给UI线程,非常适合于处理网络通信等任务。 ##### 2. 关键变量定义 - `isExit`: ...
- `BackgroundWorker`组件的工作机制,包括`DoWork`、`ProgressChanged`和`RunWorkerCompleted`事件。 - 理解线程安全,避免多线程环境下数据竞争的问题。 10. **通过使用ClickOnce部署应用程序**: - 学习使用...
ThreadPool和BackgroundWorker组件是常用的多线程工具。 9. **资源管理** Windows Forms应用可以管理各种资源,如图像、声音、字符串等。这些资源可以打包在应用程序的资源文件中,便于本地化和国际化。 10. **...
1. 背景Worker组件:.NET Framework提供了BackgroundWorker类,允许在后台线程执行耗时任务,同时保持UI线程的响应性。在WinForms中,我们可以在控件的DoWork事件中处理数据加载,而在ProgressChanged和...
8. **多线程**:在需要并行处理任务时,如后台数据更新,可以使用Thread或BackgroundWorker组件。 9. **文件操作**:“a.txt”可能涉及到文件读写,了解如何使用VB进行文件操作,如读取、写入和追加文件。 10. **...
15. **多线程编程**:使用Thread类或BackgroundWorker组件实现并发处理,提高程序性能。 16. **图形编程**:利用Graphics对象绘制图形,实现自定义UI元素。 17. **XML处理**:通过XML DOM或LINQ to XML处理XML数据...
VB.NET提供了Thread类以及BackgroundWorker组件等工具,方便地实现了并发处理能力。 6. **第三方API集成**:通过调用第三方提供的API接口(如地图服务、支付接口等),可以为聊天通信软件添加更多实用功能,增强其...
- **多线程应用实践**:在长时间操作如文件读写或网络请求过程中使用BackgroundWorker组件避免UI冻结。 - **安全性实施**:了解如何利用.NET Framework提供的安全性功能,如CAS策略限制代码访问特定资源的能力。 ...
- 使用`BackgroundWorker`组件结合定时器,可以在不阻塞用户界面的情况下执行长时间运行的任务。 5. **实现与应用场景**: - Web版本的多线程定时器常用于服务器端的定时任务,如自动备份数据库、定时发送邮件、...