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请求、压力测试、流水线技术等等。后续我们还会将一些典型案例更新在这里。
转载于:https://www.cnblogs.com/China3S/p/3452008.html
C#编程总结(四)多线程应用(进度条的编程问题)——转自http://www.cnblogs.com/yank/p/3232955.html...相关推荐
- MFC多线程使用进度条
MFC多线程使用进度条 为什么使用多线程 因为在创建进度条显示进度时,出现了进度条无法显示当前程序运行到的进度问题,通过多方查询信息,了解到应当使用线程去完成进度条的调用,才能起到效果.且使用多线程不 ...
- C#多线程使用进度条
//声明一个委托 public delegate void UpdateBar(int iBar); //委托使用进度条 void UpdateMyBa ...
- Linux系统编程1-7总结项目:进度条的实现
文章目录 (1)解决两个问题 A:缓冲区问题 B:回车与换行 (2)进度条实现 (1)解决两个问题 A:缓冲区问题 有如下代码 #include <stdio.h> #include &l ...
- Java图形化界面编程超详细知识点(7)——进度条
目录 4 JProgressBar.ProgressMonitor.BoundedRangeModel实现进度条 4.1 创建进度条 4 JProgressBar.ProgressMonitor.Bo ...
- 实验linux下的编程,实验四 Linux下的C语言编程;
<实验四 Linux下的C语言编程;>由会员分享,可在线阅读,更多相关<实验四 Linux下的C语言编程;(5页珍藏版)>请在人人文库网上搜索. 1.实验四Linux 下的 C ...
- 进度条线程怎么用java,多线程 进度条 java
场景:java设计形式(2)-观察者模式Swing 多线程事件处理进度条和Observer的一个具体应用 java设计模式(2)--观察者模式Swing 多线程事件处理进度条和Observer的一个具 ...
- C#winform使用进度条
在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口很容易假死(无法适时看到进度信息 ...
- Android学习笔记之progressBar(进度条)
一.说明 <1>在某项延续性工作的进展过程中为了不让用户觉得程序死掉了,需要有个活动的进度条,表示此过程正在进行中. <2>在某些操作的进度中的可视指示器,为用户呈现操作的进度 ...
- js实现审批流_JavaScript实现审核流程状态的动态显示进度条
中添加class即可,实现此功能的js代码如下: 标签 break; case '2': //待修复 addClass(step2.parentNode,'active'); addClass(ste ...
- winform进度条实现
最近要给一个 Winform 项目添加功能,需要一个能显示进度条的弹窗,还要求能够中止任务,所以就做了一个,在此做个记录总结.虽然用的是比较老的 Winform 技术,不过其中的原理都是相通的. lo ...
最新文章
- 今天是第一次开博客,for--futurechild!!!
- 媒体智能应用落地靠5G,视频社交需要想象力
- qprocess回调_QT进程间通信详细介绍及QProcess机制分析
- 广告主产品推词中的NLP
- Netty实例-简单的服务端-client实现,凝视具体
- 第 3-4 课:数据结构——队列详解 + 面试题
- 强烈推荐深入浅出jBPM
- Unity中资源打包成Assetsbundle的资料整理
- Python爬虫教程-22-lxml-etree和xpath配合使用
- 集体智慧编程学习笔记(2.1)提供推荐
- 我的世界颜色代码服务器不显示,我的世界颜色代码符号大全,让你构造一个五彩斑斓的世界...
- 软件测试之App测试-用户体验测试
- 网络中的海底隧道——MPLS
- dzz云桌面1.2部分主要功能图文介绍
- CTF入门学习思维导图
- 名帖291 董其昌 行书《乐志论》
- docker启动nginx及问题处理
- 中富金石老师:中颖电子实现汽车电子芯片生产 开启第二增长曲线
- matlab中计算标准差std函数
- 杂学--变量命名神器CODELF的学习和使用