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之多线程用法的更多相关文章

  1. 转载 Android 多线程处理之多线程用法大集合

    handler.post(r)其实这样并不会新起线程,只是执行的runnable里的run()方法,却没有执行start()方法,所以runnable走的还是UI线程. 1.如果像这样,是可以操作ui ...

  2. Android 多线程处理之多线程用法大集合

    handler.post(r)其实这样并不会新起线程,只是执行的runnable里的run()方法,却没有执行start()方法,所以runnable走的还是UI线程. 1.如果像这样,是可以操作ui ...

  3. Android 多线程处理之多线程用法

    handler.post(r)其实这样并不会新起线程,只是执行的runnable里的run()方法,却没有执行start()方法,所以runnable走的还是UI线程. 1.如果像这样,是可以操作ui ...

  4. 最全面的Java多线程用法解析

    1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable ...

  5. Asp.Net多线程用法1

    Asp.Net多线程简单用法 一个web页面 default.aspx 里面有两个控件GridView1,GridView2,通过两个线程分别加载绑定数据. protected void Page_L ...

  6. Android ——多线程处理之多线程用法大集合(转)

    原文地址:http://blog.csdn.net/jie1991liu/article/details/16961701 另一篇地址:http://blog.sina.com.cn/s/blog_7 ...

  7. python多线程用法及与单线程耗时比较

    下面,通过一个简单的例子,来把多线程和单线程执行任务的耗时做个比较 import time import threading # 音乐播放器 def music(func, loop): for i ...

  8. qt中多线程用法总结

    1.多线程的理解 在操作系统中线程和进程划分. 操作系统可以同时执行多个任务,每个任务就是进程:进程可以同时执行多个任务,每个任务就是线程. 线程之间相互独立,抢占式执行.对于单核CPU来说同一时刻只 ...

  9. C#基础系列——多线程的常见用法详解

    前言:前面几节分别介绍了下C#基础技术中的反射.特性.泛型.序列化.扩展方法.Linq to Xml等,这篇跟着来介绍下C#的另一基础技术的使用.最近项目有点紧张,所以准备也不是特别充分.此篇就主要从 ...

随机推荐

  1. new方法实现原理

    new方法实现原理 完整的创建一个可用的对象:Person *p=[Person new]; new方法的内部会分别调用两个方法来完成3件事情: (1)使用alloc方法来分配存储空间(返回分配的对象 ...

  2. iOS中通过链接地址打开指定APP并传参 by徐文棋

    基于项目需要,有时候需要通过一个链接,或者二维码扫描来直接打开我们所开发的客户端. 当然了.客户端也不仅仅是需要被打开,而且还要跳到相应的页面去,因此这里需要传参. 客户端想用链接打开,必须要在inf ...

  3. 数值分析:最小二乘与岭回归(Pytorch实现)

    Chapter 4 1. 最小二乘和正规方程 1.1 最小二乘的两种视角 从数值计算视角看最小二乘法 我们在学习数值线性代数时,学习了当方程的解存在时,如何找到\(\textbf{A}\bm{x}=\ ...

  4. 类(静态)变量和类(静态)static方法以及main方法、代码块,final方法的使用,单例设计模式

    类的加载:时间 1.创建对象实例(new 一个新对象时) 2.创建子类对象实例,父类也会被加载 3.使用类的静态成员时(静态属性,静态方法) 一.static 静态变量:类变量,静态属性(会被该类的所 ...

  5. python篇第3天【编码规范】

    第二天加班去了! 语法约定: 多行语句 Python语句中一般以新行作为为语句的结束符. 但是我们可以使用斜杠( \)将一行的语句分为多行显示,如下所示: total = item_one + \ i ...

  6. Solution -「CF 1132G」Greedy Subsequences

    \(\mathcal{Description}\)   Link.   定义 \(\{a\}\) 最长贪心严格上升子序列(LGIS) \(\{b\}\) 为满足以下两点的最长序列: \(\{b\}\) ...

  7. CentOS7 下 ldap 部署

    环境准备 # 关闭防火墙以及selinux,生产环境中,以实际需求为准 [root@localhost ~]# hostnamectl --static set-hostname ldap-serve ...

  8. 多图|一文详解Nacos参数!

    Nacos 中的参数有很多,如:命名空间.分组名.服务名.保护阈值.服务路由类型.临时实例等,那这些参数都是什么意思?又该如何设置?接下来我们一起来盘它. 1.命名空间 在 Nacos 中通过命名空间 ...

  9. 图解|12张图告诉你MySQL的主键查询为什么这么快

    这是图解MySQL的第3篇文章,这篇文章会让大家清楚地明白: 什么是InnoDB行格式?InnoDB页是什么? InnoDB页和InnoDB行格式都有哪些字段信息? 为什么推荐使用自增ID作为主键,而 ...

  10. css文字超出指定行数显示省略号

    display: -webkit-box; overflow: hidden; word-break: break-all; /* break-all(允许在单词内换行.) */ text-overf ...