多线程应用

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

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的更多相关文章

  1. Android——用对话框做登陆界面(自定义对话框AlertDialog,多线程,进度条ProgressDialog,ListView,GridView,SharedPreferences存,读数据,存取文本,assets文件)

    效果: 1.点击图标进入页面二 2.页面2图片暂停显示5秒进入页面三 3.点击页面三登陆按钮,打开登陆对话框,输入密码进入页面四 点击下载按钮,显示水平进度条 点击保存和获取用户名和密码 进入页面六  ...

  2. android 自定义控件——(四)圆形进度条

    ----------------------------------↓↓圆形进度条(源代码下有属性解释)↓↓---------------------------------------------- ...

  3. 端口,OSI7层模型,TCP的三次握手和四次挥手,进度条

    1.端口: 端口是为了将同一个电脑上的不同程序进行隔离 IP是找电脑,端口是找电脑上的程序 MySQL是一个软件,帮助我们在硬盘上进行文件操作,默认端口是3306 Redis是一个软件,帮助我们在内存 ...

  4. BackgroundWorker+ProgressBar+委托 实现多线程、进度条

    上文在<C# 使用BackgroundWorker实现WinForm异步>介绍了如何通过BackgroundWorker实现winForm异步通信,下面介绍如何通过BackgroundWo ...

  5. c#多线程,进度条,实时给前台发送数据

    ///做了一个wpf多线程,在实际场景中利用多线程保证程序不会卡死,性能上有所提高 //启动线程处理                Thread thread1 = new Thread(Update ...

  6. 实现winfrom进度条及进度信息提示,winfrom程序假死处理

    1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口 ...

  7. 实现winfrom进度条及进度信息提示

    1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口 ...

  8. C#winform使用进度条

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

  9. [转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理

    china_xuhua 原文地址 1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线 ...

随机推荐

  1. android 纯c/c++开发(转)

    转载自: http://jingyan.baidu.com/article/a501d80cf394dfec630f5e85.html android 自ndk r8出来以后,就开始支持纯c/c++开 ...

  2. matlab练习程序(三角形内切圆)

    三角形两角的角平分线就能确定内切圆. 结果如下: matlab代码如下: clear all;close all;clc; p=rand(,); %(x,y) v12=(p(,:)-p(,:))/no ...

  3. Android 下载文件 显示进度条

    加入两个权限 一个是联网,另一个是读写SD卡 <uses-permission android:name="android.permission.INTERNET">& ...

  4. Hark的数据结构与算法练习之鸡尾酒排序

    算法说明 鸡尾酒排序又叫定向冒泡排序,鸡尾酒搅拌排序,搅拌排序,涟漪排序,回来排序,快乐小时排序. 鸡尾酒排序是交换排序的一种,它是冒泡排序的一个轻微的变种.冒泡是从低向高比较排序,鸡尾酒从低向高,从 ...

  5. Spring的事件和监听器

    Application下抽象子类ApplicationContextEvent的下面有4个已经实现好的事件 ContextClosedEvent(容器关闭时) ContextRefreshedEven ...

  6. datetime与smalldatetime之间的区别

    1.一直以为smalldatetime和datetime的差别只是在于时间范围: smalldatetime的有效时间范围1900/1/1~2079/6/6datetime的有效时间范围1753/1/ ...

  7. ural 1431. Diplomas

    1431. Diplomas Time limit: 1.0 secondMemory limit: 64 MB It might be interesting for you to learn th ...

  8. Lazy Load, 延迟加载图片的 jQuery 插件【备忘】

    http://www.neoease.com/lazy-load-jquery-plugin-delay-load-image/ jQuery Unveil – 另一款非常轻量的延迟加载插件 http ...

  9. POJ 1925 Spiderman(DP)

    题目链接 这个破题,好不容易思路清楚了,写的就是过不了..关键部分直接抄的别人的...终于A了,自己写的判断什么的,就是有一组数据过不了. #include <cstdio> #inclu ...

  10. BZOJ3444: 最后的晚餐

    Description [问题背景] 高三的学长们就要离开学校,各奔东西了.某班n人在举行最后的离别晚餐时,饭店老板觉得十分纠结.因为有m名学生偷偷找他,要求和自己暗恋的同学坐在一起. [问题描述] ...