C#编程总结(四)多线程应用(进度条的编程问题)——转自http://www.cnblogs.com/yank/p/3232955.html

多线程应用

多线程应用很广泛,简单总结了一下:

1)不阻断主线程,实现即时响应,由后台线程完成特定操作
2)多个线程,完成同类任务,提高并发性能
3)一个任务有多个独立的步骤,多个线程并发执行各子任务,提高任务处理效率

下面我们通过几个小例子做简单介绍。

1、进度条

分析:页面动态刷新,主页面正常可操作。我们通过后台线程来实现进度条。

首先,创建Winform页面,然后拖入进度条控件,将页面的代码改为以下代码即可。

这里只是个简单的例子,其实我们可以做的更好,将进度条封装为一个自定义控件,设计为一个通用好看的进度条。这里只讲技术和方向,大家可以自己研究研究。

相关代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace ProgressBarSample
{//定义委托,异步调用delegate void ShowProgressDelegate(int totalStep, int currentStep);public partial class Form1 : Form{public Form1(){InitializeComponent();}/// <summary>/// /// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnStart_Click(object sender, EventArgs e){ParameterizedThreadStart start = new ParameterizedThreadStart(SetProgress);Thread progressThread = new Thread(start);progressThread.IsBackground = true;//标记为后台进程,在窗口退出时,正常退出
            progressThread.Start();}/// <summary>/// 设置当前进度/// </summary>/// <param name="state"></param>void SetProgress(object state){for (int i = 1; i <= 100; i++){Thread.Sleep(200);object[] objs = new object[] { 100, i };//异步调用this.Invoke(new ShowProgressDelegate(ShowProgress), objs);}}/// <summary>/// 刷新进度条/// </summary>/// <param name="totalStep"></param>/// <param name="currentStep"></param>void ShowProgress(int totalStep, int currentStep){this.progressBar1.Maximum = totalStep;this.progressBar1.Value = currentStep;this.lbCurrent.Text = this.progressBar1.Value * 100 / progressBar1.Maximum + "%";}}
}

2、网络扒虫

经常遇到这样的场景,通过扒虫程序,去互联网获取所需资源。其实搜索引擎的一个重要组成部分就是扒虫。但是,往往扒虫程序比较费时,这时就需要多线程帮忙。

这里写一个简单的扒虫程序,说明下原理。

案例:通过网络连接,获取网络相关信息。

扒虫对象:

using System;
using System.Net;namespace Reptile
{public class NetReptile{/// <summary>/// /// </summary>public string Url { get; set; }/// <summary>/// /// </summary>/// <param name="url"></param>public NetReptile(string url){this.Url = url;}/// <summary>/// /// </summary>/// <returns></returns>public string GetContent(){WebClient client = new WebClient();return client.DownloadString(new Uri(this.Url));}}
}

抓到内容后,需要解析,提取我们需要的内容,这里以抓取网页的标题为例。解析器代码:

using System;
using System.Text;
using System.Text.RegularExpressions;namespace Reptile
{/// <summary>/// HTML解析器/// </summary>public class HtmlAnalyzer{/// <summary>/// 构造函数/// </summary>public HtmlAnalyzer(){ }/// <summary>/// 获取标题/// </summary>/// <param name="html"></param>/// <returns></returns>public string GetTitle(string html){Regex regext = new Regex("(?<=<title>).*?(?=</title>)");Match m = regext.Match(html);if (m != null){return m.ToString();                }return null;}}
}

使用多线程创建扒虫,抓取数据:

   /// <summary>/// 多线程处理/// </summary>private void MultiThread(){string urls = tbUrl.Text;string[] separater = { "\r\n" };string[] urlList = urls.Split(separater, StringSplitOptions.RemoveEmptyEntries);int i = 1;foreach (var url in urlList){Thread thread = new Thread(new ParameterizedThreadStart(Snap));thread.Name = "Thread" + i.ToString();thread.Start(url);i++;}//RefreshData();
        }/// <summary>/// 抓取数据/// </summary>/// <param name="state"></param>private void Snap(object state){string url = state as string;NetReptile reptile = new NetReptile(url);string html = reptile.GetContent();if (!string.IsNullOrEmpty(html)){HtmlAnalyzer analyzer = new HtmlAnalyzer();string title = analyzer.GetTitle(html);Thread.Sleep(2000);this.Invoke(new AddItemDelegate(this.AddItem),title);                }}/// <summary>/// /// </summary>/// <param name="item"></param>private void AddItem(string item){this.listData.Items.Add(item);}

全部源码:http://files.cnblogs.com/yank/Reptile.rar

其他:

多线程应用还有很多,比如:文件上传和下载、异步加载、Web请求、压力测试、流水线技术等等。后续我们还会将一些典型案例更新在这里。

posted on 2013-12-01 00:19 向北方 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/China3S/p/3452008.html

C#编程总结(四)多线程应用(进度条的编程问题)——转自http://www.cnblogs.com/yank/p/3232955.html...相关推荐

  1. MFC多线程使用进度条

    MFC多线程使用进度条 为什么使用多线程 因为在创建进度条显示进度时,出现了进度条无法显示当前程序运行到的进度问题,通过多方查询信息,了解到应当使用线程去完成进度条的调用,才能起到效果.且使用多线程不 ...

  2. C#多线程使用进度条

    //声明一个委托         public delegate void UpdateBar(int iBar);         //委托使用进度条         void UpdateMyBa ...

  3. Linux系统编程1-7总结项目:进度条的实现

    文章目录 (1)解决两个问题 A:缓冲区问题 B:回车与换行 (2)进度条实现 (1)解决两个问题 A:缓冲区问题 有如下代码 #include <stdio.h> #include &l ...

  4. Java图形化界面编程超详细知识点(7)——进度条

    目录 4 JProgressBar.ProgressMonitor.BoundedRangeModel实现进度条 4.1 创建进度条 4 JProgressBar.ProgressMonitor.Bo ...

  5. 实验linux下的编程,实验四 Linux下的C语言编程;

    <实验四 Linux下的C语言编程;>由会员分享,可在线阅读,更多相关<实验四 Linux下的C语言编程;(5页珍藏版)>请在人人文库网上搜索. 1.实验四Linux 下的 C ...

  6. 进度条线程怎么用java,多线程 进度条 java

    场景:java设计形式(2)-观察者模式Swing 多线程事件处理进度条和Observer的一个具体应用 java设计模式(2)--观察者模式Swing 多线程事件处理进度条和Observer的一个具 ...

  7. C#winform使用进度条

    在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口很容易假死(无法适时看到进度信息 ...

  8. Android学习笔记之progressBar(进度条)

    一.说明 <1>在某项延续性工作的进展过程中为了不让用户觉得程序死掉了,需要有个活动的进度条,表示此过程正在进行中. <2>在某些操作的进度中的可视指示器,为用户呈现操作的进度 ...

  9. js实现审批流_JavaScript实现审核流程状态的动态显示进度条

    中添加class即可,实现此功能的js代码如下: 标签 break; case '2': //待修复 addClass(step2.parentNode,'active'); addClass(ste ...

  10. winform进度条实现

    最近要给一个 Winform 项目添加功能,需要一个能显示进度条的弹窗,还要求能够中止任务,所以就做了一个,在此做个记录总结.虽然用的是比较老的 Winform 技术,不过其中的原理都是相通的. lo ...

最新文章

  1. 今天是第一次开博客,for--futurechild!!!
  2. 媒体智能应用落地靠5G,视频社交需要想象力
  3. qprocess回调_QT进程间通信详细介绍及QProcess机制分析
  4. 广告主产品推词中的NLP
  5. Netty实例-简单的服务端-client实现,凝视具体
  6. 第 3-4 课:数据结构——队列详解 + 面试题
  7. 强烈推荐深入浅出jBPM
  8. Unity中资源打包成Assetsbundle的资料整理
  9. Python爬虫教程-22-lxml-etree和xpath配合使用
  10. 集体智慧编程学习笔记(2.1)提供推荐
  11. 我的世界颜色代码服务器不显示,我的世界颜色代码符号大全,让你构造一个五彩斑斓的世界...
  12. 软件测试之App测试-用户体验测试
  13. 网络中的海底隧道——MPLS
  14. dzz云桌面1.2部分主要功能图文介绍
  15. CTF入门学习思维导图
  16. 名帖291 董其昌 行书《乐志论》
  17. docker启动nginx及问题处理
  18. 中富金石老师:中颖电子实现汽车电子芯片生产 开启第二增长曲线
  19. matlab中计算标准差std函数
  20. 杂学--变量命名神器CODELF的学习和使用

热门文章

  1. 计算机cmd测试,电脑cmd命令怎么测试网速详细步骤
  2. Arduino ide配置esp32硬件支持(配置esp32的arduino开发环境)
  3. chrome下载速度慢,提高下载速度
  4. 自动合并两个.bib 去除.bib中的重复条目
  5. 泰坦尼克号幸存者预测
  6. RocksDB Compaction(一)介绍
  7. B站视频怎么下载?提取视频文稿的简单方法!
  8. 配置本地yum源文件
  9. 基督教 犹太  新教  东正教 天主教
  10. 北美常见水果与蔬菜的中英文对照