Net之多线程用法
1.多线程
2.线程池
3.Task
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Threading;
using System.Diagnostics; namespace MyThreads
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
} private void TestMethod()
{
int sum = 0;
for (int i = 1; i < 100; i++)
{
sum += i;
}
Console.WriteLine("TestMethod当前线程的Id={0},sum= {1}", Thread.CurrentThread.ManagedThreadId, sum);
}
private void TestThread(string name)
{
int sum = 0;
for (int i = 1; i < 100; i++)
{
sum += i;
}
Console.WriteLine("{0}当前线程的Id={1},sum= {2}", name,Thread.CurrentThread.ManagedThreadId, sum);
}
private void brtThread_Click(object sender, RoutedEventArgs e)
{
Console.WriteLine("这里是单线程");
for (int i = 0; i < 5; i++)
{
TestMethod();
}
}
private void brtMutriThread_Click(object sender, RoutedEventArgs e)
{
Stopwatch sw = new Stopwatch();
sw.Start();
Console.WriteLine("这里是多线程");
Console.WriteLine(string.Format("当前线程的id:{0}", Thread.CurrentThread.ManagedThreadId));
List<Thread> threadList = new List<Thread>();
ThreadStart threadStart = () => TestMethod();
for (int i = 0; i < 5; i++)
{
Thread thread = new Thread(threadStart);
threadList.Add(thread);
thread.Start();
}
threadList.ForEach(t => t.Join());
Console.WriteLine(string.Format("brtMutriThread_Click已结束,可以执行其他动作当前线程的id={0}",
Thread.CurrentThread.ManagedThreadId));
sw.Stop();
Console.WriteLine("总耗时{0}", sw.ElapsedMilliseconds);
} private void brtThreadPool_Click(object sender, RoutedEventArgs e)
{
Stopwatch sw = new Stopwatch();
sw.Start();
Console.WriteLine("这里是多线程");
Console.WriteLine(string.Format("当前线程的id:{0}", Thread.CurrentThread.ManagedThreadId));
//线程池
//ThreadPool.QueueUserWorkItem(t => TestThread("ThreadPool1"));
//ThreadPool.QueueUserWorkItem(t => TestThread(t.ToString()), "ThreadPool2");
//ThreadPool.QueueUserWorkItem(t => TestThread(t.ToString()), "ThreadPool3");
//ThreadPool.QueueUserWorkItem(t => TestThread(t.ToString()), "ThreadPool4");
//ThreadPool.QueueUserWorkItem(t => TestThread(t.ToString()), "ThreadPool5"); using (ManualResetEvent m1 = new ManualResetEvent(false))
using (ManualResetEvent m2 = new ManualResetEvent(false))
using (ManualResetEvent m3 = new ManualResetEvent(false))
using (ManualResetEvent m4 = new ManualResetEvent(false))
using (ManualResetEvent m5 = new ManualResetEvent(false))
{
ThreadPool.QueueUserWorkItem(t => {
TestThread("ThreadPool1");
m1.Set();
});
ThreadPool.QueueUserWorkItem(t => {
TestThread("ThreadPool2");
m2.Set();
});
ThreadPool.QueueUserWorkItem(t =>
{
TestThread("ThreadPool3");
m3.Set();
});
ThreadPool.QueueUserWorkItem(t =>
{
TestThread("ThreadPool4");
m4.Set();
});
ThreadPool.QueueUserWorkItem(t =>
{
TestThread("ThreadPool5");
m5.Set();
});
m1.WaitOne();
m2.WaitOne();
m3.WaitOne();
m4.WaitOne();
m5.WaitOne();
}
Console.WriteLine(string.Format("brtMutriThread_Click已结束,可以执行其他动作当前线程的id={0}",
Thread.CurrentThread.ManagedThreadId));
sw.Stop();
Console.WriteLine("总耗时{0}", sw.ElapsedMilliseconds);
}
// task本质是基于线程池的,只是API被强化
private void brnTask_Click(object sender, RoutedEventArgs e)
{
Stopwatch sw = new Stopwatch();
sw.Start();
Console.WriteLine("这里是多线程");
Console.WriteLine(string.Format("当前线程的id:{0}", Thread.CurrentThread.ManagedThreadId));
//Task
List<Task> taskList = new List<Task>();
TaskFactory taskFactory = new TaskFactory();
for (int i = 0; i < 5;i++ )
{
taskList.Add(taskFactory.StartNew(() => TestThread("Task")));
}
Task.WaitAll(taskList.ToArray());
Console.WriteLine(string.Format("brnTask_Click已结束,可以执行其他动作当前线程的id={0}",
Thread.CurrentThread.ManagedThreadId));
sw.Stop();
Console.WriteLine("总耗时{0}", sw.ElapsedMilliseconds);
}
}
}
<Window x:Class="MyThreads.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="350">
<Grid>
<Button Content="单线程" Height="23" HorizontalAlignment="Left" Margin="108,63,0,0" Name="brtThread" VerticalAlignment="Top" Width="75" Click="brtThread_Click" />
<Button Content="多线程" Height="23" HorizontalAlignment="Left" Margin="108,112,0,0" Name="brtMutriThread" VerticalAlignment="Top" Width="75" Click="brtMutriThread_Click" />
<Button Content="线程池" Height="23" HorizontalAlignment="Left" Margin="108,168,0,0" Name="brtThreadPool" VerticalAlignment="Top" Width="75" Click="brtThreadPool_Click" />
<Button Content="Task" Height="23" HorizontalAlignment="Left" Margin="108,216,0,0" Name="brnTask" VerticalAlignment="Top" Width="75" Click="brnTask_Click" />
</Grid>
</Window>

Net之多线程用法的更多相关文章
- 转载 Android 多线程处理之多线程用法大集合
handler.post(r)其实这样并不会新起线程,只是执行的runnable里的run()方法,却没有执行start()方法,所以runnable走的还是UI线程. 1.如果像这样,是可以操作ui ...
- Android 多线程处理之多线程用法大集合
handler.post(r)其实这样并不会新起线程,只是执行的runnable里的run()方法,却没有执行start()方法,所以runnable走的还是UI线程. 1.如果像这样,是可以操作ui ...
- Android 多线程处理之多线程用法
handler.post(r)其实这样并不会新起线程,只是执行的runnable里的run()方法,却没有执行start()方法,所以runnable走的还是UI线程. 1.如果像这样,是可以操作ui ...
- 最全面的Java多线程用法解析
1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable ...
- Asp.Net多线程用法1
Asp.Net多线程简单用法 一个web页面 default.aspx 里面有两个控件GridView1,GridView2,通过两个线程分别加载绑定数据. protected void Page_L ...
- Android ——多线程处理之多线程用法大集合(转)
原文地址:http://blog.csdn.net/jie1991liu/article/details/16961701 另一篇地址:http://blog.sina.com.cn/s/blog_7 ...
- python多线程用法及与单线程耗时比较
下面,通过一个简单的例子,来把多线程和单线程执行任务的耗时做个比较 import time import threading # 音乐播放器 def music(func, loop): for i ...
- qt中多线程用法总结
1.多线程的理解 在操作系统中线程和进程划分. 操作系统可以同时执行多个任务,每个任务就是进程:进程可以同时执行多个任务,每个任务就是线程. 线程之间相互独立,抢占式执行.对于单核CPU来说同一时刻只 ...
- C#基础系列——多线程的常见用法详解
前言:前面几节分别介绍了下C#基础技术中的反射.特性.泛型.序列化.扩展方法.Linq to Xml等,这篇跟着来介绍下C#的另一基础技术的使用.最近项目有点紧张,所以准备也不是特别充分.此篇就主要从 ...
随机推荐
- NSLog输出格式及随机数
NSLog输出格式及随机数 %@ 对象 %d, %i 整数 (%i和%d无差别,%i是老式写法,%d是新式写法而已.) %u 无符整形 %f 浮点/双字 %x, %X 二进制整数 %o 八进制整数 % ...
- docker 介绍及安装操作
docker 介绍及安装操作 1.docker概述 2.docker安装及操作 1.docker概述: Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源 是在L ...
- 安装Linux8.3.2011
镜像地址:http://mirrors.aliyun.com/centos/8.3.2011/isos/x86_64/ 非DVD镜像安装时的安装源地址:http://mirrors.aliyun.co ...
- Docker创建私有镜像仓库
Docker官方提供了一个工具docker-registry,可以借助这个工具构建私有镜像仓库: 1.拉取registry镜像 # docker pull registry//可以使用 docker ...
- 使用动态时间规整 (DTW) 解决时间序列相似性度量及河流上下游污染浓度相似性识别分析
时间序列相似性度量方法 时间序列相似性度量常用方法为欧氏距离ED(Euclidean distance)和动态时间规整DTW(Dynamic Time Warping).总体被分为两类: 锁步度量(l ...
- ASP.NET Core 6框架揭秘-实例演示版[持续更新中…]
作为<ASP.NET Core 3框架揭秘>的升级版,<ASP.NET Core 6框架揭秘>提供了很多新的章节,同时对现有的内容进行大量的修改.虽然本书旨在对ASP.NET ...
- [入门到吐槽系列] Webix 10分钟入门 二 表单Form的使用
前言 继续接着上一篇的webix入门:https://www.cnblogs.com/zc22/p/15912342.html.今天完成剩下两个最重要的控件,表单和表格的使用.掌握了这两个,整个Web ...
- Linux系统日志清除实验
实验目的 1.了解Linux日志的作用. 2.掌握删除Linux日志的方法. 实验原理 所谓日志(Log)是指系统所指定对象的某些操作和其操作结果按时间有序的集合.每个日志文件由日志记录组成,每条日志 ...
- RFC2899广播吞吐量测试——网络测试仪实操
一.简介 RFC 2889为LAN交换设备的基准测试提供了方法学,它将RFC 2544中为网络互联设备基准测试所定义的方法学扩展到了交换设备,提供了交换机转发性能(Forwarding Perform ...
- BI报表系统该如何集成到其他系统呢?
近期小麦我经常收到很多用户的反馈,想知道Smartbi的报表能不能从微信/钉钉之类的直接跳转到已做好的报表页面?他们都希望通过这种方式尽可能地避免由于各个管理软件账号密码不同而造成的不便,能够在日常工 ...