摘要:
下载文件是常见任务,通常情况下,最好以单独的线程来运行这项可能很耗时的操作。使用 BackgroundWorker 组件可以用非常少的代码完成此任务。示例:下面的代码示例演示如何使用 BackgroundWorker 组件从 URL 加载 XML 文件。用户单击“下载”按钮时,Click 事件处理程序将调用 BackgroundWorker 组件的 RunWorkerAsync 方法来启动下载操作。在下载过程中,将禁用该按钮,然后在下载完成后再启用该按钮。MessageBox 将显示文件的内容。using System;using System.Collections.Generic;usin 阅读全文
摘要:
下面的程序示例创建了一个计算 Fibonacci 数的窗体。该计算运行于用户界面线程之外的另一个线程上,因此用户界面可在计算进行的同时继续运行,而不会出现延迟。示例:using System;using System.Collections;using System.ComponentModel;using System.Drawing;using System.Threading;using System.Windows.Forms;namespace BackgroundWorkerExample{ public class FibonacciForm : System.Windows.. 阅读全文
摘要:
如果有一个需要很长时间才能完成的操作,而且不希望用户界面中出现延迟,则可以使用 BackgroundWorker 类来在另一个线程上运行该操作。下面的代码示例演示如何在后台运行耗时的操作。该窗体具有“开始”和“取消”按钮。单击“开始”按钮可运行异步操作。单击“取消”按钮可停止正在运行的异步操作。每个操作的结果均在 MessageBox 中显示。Visual Studio 中对此任务提供了广泛的支持。示例:using System;using System.ComponentModel;using System.Drawing;using System.Threading;using Syste 阅读全文
摘要:
BackgroundWorker 组件替换了 System.Threading 命名空间并添加了功能,但是,也可选择保留 System.Threading 命名空间以备向后兼容和将来使用。有关更多信息,请参见 BackgroundWorker 组件概述。“Windows 窗体”使用单线程单元 (STA) 模型,因为“Windows 窗体”基于本机 Win32 窗口,而 Win32 窗口从本质上而言是单元线程。STA 模型意味着可以在任何线程上创建窗口,但窗口一旦创建后就不能切换线程,并且对它的所有函数调用都必须在其创建线程上发生。除了 Windows 窗体之外,.NET Framework 中 阅读全文
摘要:
使用多线程提高 Windows 窗体应用程序的性能时,必须注意以线程安全方式调用控件。示例:访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用情况和死锁。确保以线程安全方式访问控件非常重要。.NET Framework 有助于在以非线程安全方式访问控件时检测到这一问题。在调试器中运行应用程序时,如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException,并显示以下消息:“从不是创建控件控件名称 的线程访问它。 阅读全文