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 = ; i <= ; i++)
{
Thread.Sleep();
object[] objs = new object[] { , 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 * / 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 = ; 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();
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请求、压力测试、流水线技术等等。后续我们还会将一些典型案例更新在这里。
C#编程总结(四)多线程应用(进度条的编程问题)——转自http://www.cnblogs.com/yank/p/3232955.html的更多相关文章
- Android——用对话框做登陆界面(自定义对话框AlertDialog,多线程,进度条ProgressDialog,ListView,GridView,SharedPreferences存,读数据,存取文本,assets文件)
效果: 1.点击图标进入页面二 2.页面2图片暂停显示5秒进入页面三 3.点击页面三登陆按钮,打开登陆对话框,输入密码进入页面四 点击下载按钮,显示水平进度条 点击保存和获取用户名和密码 进入页面六 ...
- android 自定义控件——(四)圆形进度条
----------------------------------↓↓圆形进度条(源代码下有属性解释)↓↓---------------------------------------------- ...
- 端口,OSI7层模型,TCP的三次握手和四次挥手,进度条
1.端口: 端口是为了将同一个电脑上的不同程序进行隔离 IP是找电脑,端口是找电脑上的程序 MySQL是一个软件,帮助我们在硬盘上进行文件操作,默认端口是3306 Redis是一个软件,帮助我们在内存 ...
- BackgroundWorker+ProgressBar+委托 实现多线程、进度条
上文在<C# 使用BackgroundWorker实现WinForm异步>介绍了如何通过BackgroundWorker实现winForm异步通信,下面介绍如何通过BackgroundWo ...
- c#多线程,进度条,实时给前台发送数据
///做了一个wpf多线程,在实际场景中利用多线程保证程序不会卡死,性能上有所提高 //启动线程处理 Thread thread1 = new Thread(Update ...
- 实现winfrom进度条及进度信息提示,winfrom程序假死处理
1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口 ...
- 实现winfrom进度条及进度信息提示
1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口 ...
- C#winform使用进度条
在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口很容易假死(无法适时看到进度信息 ...
- [转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理
china_xuhua 原文地址 1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线 ...
随机推荐
- Struts2的@ResultPath
转自:http://blog.csdn.net/yandufeng/article/details/8105495 这里我要补充一下:要理解Annotation,最好的方法还是看源码,struts中c ...
- codeforces Round #263(div2) D. Appleman and Tree 树形dp
题意: 给出一棵树,每个节点都被标记了黑或白色,要求把这棵树的其中k条变切换,划分成k+1棵子树,每颗子树必须有1个黑色节点,求有多少种划分方法. 题解: 树形dp dp[x][0]表示是以x为根的树 ...
- loj 1221(spfa判正环)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25957 思路:由于路线为一个环,将路径上的权值改为c-p*d,那么 ...
- C#环境下,文本框翻屏,怎么一直显示当前插入的内容!!!!!!!!!!!!!!!!
//-----------------------显示当前插入的位置------------------------ textBox3.SelectionStart = textBox3.Text.L ...
- listview分页
listview.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStat ...
- Android广播机制概述
1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通 ...
- HTML-Canvas03
颜色合成 globalCompositeOperation 属性: //先绘制一个图形. ctx.fillStyle = "#00ff00"; ctx.fillRect(10,10 ...
- 【BZOJ】3339: Rmq Problem & 3585: mex(线段树+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=3585 好神的题. 但是!!!!!!!!!!!!!!我线段树现在要开8倍空间才能过!!!!!!!!!! ...
- linux tar 备份命令
转载:http://www.douban.com/note/57861194/ tar [-cxtzjvfpPN] 文件与目录 ….参数:-c :建立一个压缩文件的参数指令(create 的意思):- ...
- log4j - 配置文件
Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息. 通过配置,可以创建出Log4J的运行环 ...