C#编程总结(四)多线程应用

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

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#编程总结(四)多线程应用的更多相关文章

  1. 5天玩转C#并行和多线程编程 —— 第四天 Task进阶

    5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...

  2. 《Java 8实战》读书笔记系列——第三部分:高效Java 8编程(四):使用新的日期时间API

    https://www.lilu.org.cn/https://www.lilu.org.cn/ 第十二章:新的日期时间API 在Java 8之前,我们常用的日期时间API是java.util.Dat ...

  3. AOP面向切面编程的四种实现

     一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...

  4. WCF编程系列(四)配置文件

    WCF编程系列(四)配置文件   .NET应用程序的配置文件 前述示例中Host项目中的App.config以及Client项目中的App.config称为应用程序配置文件,通过该文件配置可控制程序的 ...

  5. Java 网络编程(四) InetAddress类

    链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/09/2951895.html Java 网络编程(四) InetAddress类 InetAdd ...

  6. socket编程,简单多线程服务端测试程序

    socket编程,简单多线程服务端测试程序 前些天重温了MSDN关于socket编程的WSAStartup.WSACleanup.socket.closesocket.bind.listen.acce ...

  7. 「面向打野编程」iOS多线程:CGD

    「面向打野编程」iOS多线程:CGD 前言 参考网络其他文章而写,渣水平,抛砖引玉. 虽然Concurrent意思为并发,但由于队列的实际效果,以下称为并行队列. 当前iPhone的CPU核心数远小于 ...

  8. 脑残式网络编程入门(四):快速理解HTTP/2的服务器推送(Server Push)

    本文原作者阮一峰,作者博客:ruanyifeng.com. 1.前言 新一代HTTP/2 协议的主要目的是为了提高网页性能(有关HTTP/2的介绍,请见<从HTTP/0.9到HTTP/2:一文读 ...

  9. [Java并发编程(四)] Java volatile 的理论实践

    [Java并发编程(四)] Java volatile 的理论实践 摘要 Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 ...

  10. 【转】编程思想之多线程与多进程(3)——Java中的多线程

    <编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程>一文详细讲述了线程.进程的关系及在操作系统中的表现,这是多线程学习必须了解的基础.本文将接着讲一下Java中多线程程序的 ...

随机推荐

  1. 缓存篇~第八回 Redis实现基于方法签名的数据集缓存~续(优化缓存中的key)

    返回目录 上一讲主要是说如何将数据集存储到redis服务器里,而今天主要说的是缓存里的键名,我们习惯叫它key. redis或者其它缓存组件实现的存储机制里,它将很多方法对应的数据集存储在一个公共的空 ...

  2. NodeJS系列~第三个小例子,NodeJs与Redis实现高并发的队列存储

    返回目录 众所周知 redis量个强大的缓存组件,可以部署在win32和linux环境之上,它有五大存储结构,其中有一种为列表list,它可以实现quene和stack的功能,即队列和堆栈的功能. r ...

  3. 使用finfo_file()函数检测上传图片的类型

    该函数可以检测文件的MIME类型.因为有时候我们只根据文件后缀来判断是不准确的. function getMIME($filename){ $finfo = finfo_open(FILEINFO_M ...

  4. 在Windows下安装Memcached

    Windows下的Memcache安装: 需要运行命令行工具cmd 请以管理员权限运行 开始->附件->命令提示符,以管理员身份运行 假如当前C:\windows\system32,输入c ...

  5. Nodejs·构建web应用

    本篇的内容比较多..... 1 首先是从基本的Nodejs服务方面讲述前后端统一语言在web应用中的作用: 2 然后讲了web中基本的知识,从请求方法到路由.从查询字符串到Cookie和Session ...

  6. Atitit 文档资料管理同步解决方案

    Atitit 文档资料管理同步解决方案 流程 生成快照, 操作. 使用快照与dir对比,生成操作日志 /atiplat_cms/src/com/attilax/sync/SyncUtil.java p ...

  7. Atitit 全屏模式的cs桌面客户端软件gui h5解决方案 Kiosk模式

    Atitit 全屏模式的cs桌面客户端软件gui h5解决方案 Kiosk模式 1.1. Kiosk Software广泛用于公共电脑或者嵌入系统,最常用的就是ATM机.自动服务机之类的系统了.,1 ...

  8. 使用swoole和websocket结合来制造弹幕

    在知乎上无意中看到了一篇有关这个的话题https://zhuanlan.zhihu.com/p/23992890,刚好没事也好久没弄swoole了就自己按照知乎上的那篇文站实操了一下 那个试验中有几个 ...

  9. React 入门实例教程

    现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Face ...

  10. 【转】Windows Phone在隔离存储里存取图片文件

    一共两个页面,第一个为MainPage.xaml,代码如下: <!--ContentPanel - place additional content here--> <Grid x: ...