1,WPF应用程序为单线程模型(STAThread),所有UI控件都是主线程创建的,只有主线程能操作UI元素的显示。

2,其他工作线程要维护UI控件的显示,需调用主线程的Dispather,执行Invoke(同步)或BeginInvoke(异步)方法。

3,UI线程如时行耗时的操作,将使UI假死,用户体验较差。应使用后台线程进行耗时操作,并异步更新UI。

4,BackgroundWorker是WPF的一个后台工作类,代码说明一切:

前台:

    <StackPanel>
<ProgressBar Name="progressBar" Height="20" Width="200" Margin="10"></ProgressBar>
<Button Name="btnProcess" Width="100" Click="btnProcess_Click" Margin="5">开始后台任务</Button>
<Button Name="btnCancel" Width="100" Click="btnCancel_Click" Margin="5">取消后台任务</Button>
</StackPanel>

后台:

 public partial class MainWindow : Window
{
BackgroundWorker bgWorker = new BackgroundWorker();
public MainWindow()
{
InitializeComponent(); bgWorker.WorkerReportsProgress = true;
bgWorker.WorkerSupportsCancellation = true;
bgWorker.DoWork += DoWork_Handler;
bgWorker.ProgressChanged += ProgressChanged_Handler;
bgWorker.RunWorkerCompleted += RunWorkerCompleted_Handler;
} private void btnProcess_Click(object sender, RoutedEventArgs e)
{
if (!bgWorker.IsBusy)
{
bgWorker.RunWorkerAsync();
}
} private void ProgressChanged_Handler(object sender, ProgressChangedEventArgs args)
{
progressBar.Value = args.ProgressPercentage; } //后台线程运行的程序
private void DoWork_Handler(object sender, DoWorkEventArgs args)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = ; i <= ; i++)
{
if (worker.CancellationPending)
{
args.Cancel = true;
break;
}
else
{
worker.ReportProgress(i); //因为这在后台线程,要想直接修改UI控件,需用Invoke或BeginInvoke方法
//this.Dispatcher.Invoke(new Action(() =>
//{
// progressBar.Value = i;
//})); Thread.Sleep(); //因为频繁调用UI线程,为了给UI线程反应时间,这里让后台线程稍顿一下
}
} } private void RunWorkerCompleted_Handler(object sender, RunWorkerCompletedEventArgs args)
{
progressBar.Value = ;
if (args.Cancelled)
{
MessageBox.Show("后台任务已经被取消。", "消息");
}
else
{
MessageBox.Show("后台任务正常结束。", "消息");
}
}
private void btnCancel_Click(object sender, RoutedEventArgs e)
{
bgWorker.CancelAsync();
}
}

使用BackgroundWorker的更多相关文章

  1. C# BackgroundWorker 详解

    在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题.解决这类问题的主要途径是使用多线程,启动一个后台线程,把运算操作放在这个后台线程中完 ...

  2. 【Winform】使用BackgroundWorker控制进度条显示进度

    许多开发者看见一些软件有进度条显示进度,自己想弄,项目建好后发现并没有自己想象中的那么简单...看了网上很多教程后,写了一个小Demo供网友们参考~~,Demo的网址:http://pan.baidu ...

  3. C# 多線程&BackgroundWorker概念入門教程

    感謝以下各位作者的貢獻~ 百度經驗舉了個例子,很好理解BackgroundWorker的用途(主要是用來啟動後台線程,而不阻塞調用程式的運行),收藏一下  http://jingyan.baidu.c ...

  4. 【C#】【Thread】BackgroundWorker的使用

    BackgroundWorker 可以用于启动后台线程. 主要的事件及参数: 1.DoWork --当执行BackgroundWorker.RunWorkerAsync方法时会触发该事件,并且传递Do ...

  5. 用于异步的BackgroundWorker

    XAML代码: <Window x:Class="backgroundtest.MainWindow" xmlns="http://schemas.microsof ...

  6. C# 使用BackgroundWorker例子及注意点

    该例子为使用BackgroundWorker在TextBox文本中产生一个10000以内并且能被5整除的数(1秒产生一个) 操作界面可以启动线程,也可以停止线程,界面设计如图: 先贴代码,有注释的地方 ...

  7. C# BackgroundWorker组件学习入门介绍

    C# BackgroundWorker组件学习入门介绍 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能 ...

  8. winform异步系统升级—BackgroundWorker

    BackgroundWorker用法实例 自己的代码,就是要执行的代码写到dowork里,ProgressChanged事件是控制进度时用的,最后的Completed事件进度完成,也就是dowork里 ...

  9. BackgroundWorker组件的作用

    当构建一个图形化的Windows Form桌面应用程序并且需要执行在应用程序主UI线程之外的线程中长时间的任务时,BackgroundWorker类就很有用了. 要使用BackgroundWorker ...

  10. C# BackgroundWorker的使用

    文章摘自:http://www.cnblogs.com/tom-tong/archive/2012/02/22/2363965.html BackgroundWorker 可以用于启动后台线程. 主要 ...

随机推荐

  1. Jenkins系列-Jenkins添加git密钥对

    添加密钥 1.添加git用户和git密码对 ,用于git客户端从gitlab上拉取代码到本地

  2. dede5.7文章模型(非软件模型)添加下载附件的方法

    添加字段 ---- > 字段类型为 附件 --- - > templets/system/channel_addon.htm 代码清空,只保留 ~link~ -+---> 保存. & ...

  3. ::before和::after 常见的用法

      .lizi:after{ content: "I'M after"; /*插入字符串*/ content: "attr(id)"; /*插入当前元素属性*/ ...

  4. Mybatis笔记二

    一对一查询 案例:查询所有订单信息,订单信息中显示下单人信息. 注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询.如果从用户信息出发查询用户下的订单信息则 ...

  5. 【bzoj1304】[CQOI2009]叶子的染色 树形dp

    题目描述 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点( ...

  6. SP263 PERIOD - Period

    题目描述 For each prefix of a given string S with N characters (each character has an ASCII code between ...

  7. [LOJ #2473] [九省联考2018] 秘密袭击coat

    题目链接 洛谷. LOJ,LOJ机子是真的快 Solution 我直接上暴力了...\(O(n^2k)\)洛谷要\(O2\)才能过...loj平均单点一秒... 直接枚举每个点为第\(k\)大的点,然 ...

  8. CF#508 1038E Maximum Matching

    ---题面--- 题解: 感觉还是比较妙的,复杂度看上去很高(其实也很高),但是因为n只有100,所以还是可以过的. 考虑一个很暴力的状态f[i][j][x][y]表示考虑取区间i ~ j的方格,左右 ...

  9. BZOJ2693:JZPTAP——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2693 Description   Input 一个正整数T表示数据组数 接下来T行 每行两个正整数 ...

  10. BZOJ2705:[SDOI2012]Longge的问题——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2705 Description Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题.现在 ...