C#多线程Thread使用示例详解
作者:空山新雨 发布时间:2021-11-12 06:52:05
标签:C#,多线程,Thread
本文实例为大家分享了C#多线程Thread使用的示例代码,供大家参考,具体内容如下
多线程:
线程生命周期状态图:
C#线程优先级(概率高低):
基本使用示例:
using System;
using System.Threading;
namespace month_9_10._1009
{
class Run5
{
/* 测试线程的调用过程
* 主线程输出world,子线程输出hello
*/
public static void showHello()
{
for(int i = 0; i < 100; i++)
{
Console.WriteLine($"Hello\t#{Thread.CurrentThread.Name}");
}
}
public static void Main(string[] args)
{
Thread.CurrentThread.Name = "Main Thread!";
var childThreadRef = new ThreadStart(showHello);
Console.WriteLine("This is Main process!!!");
var childThread = new Thread(childThreadRef);
childThread.Name = "Child Thread!";
childThread.Start();
for (int i = 0; i < 100; i++)
{
Console.WriteLine($"World!\t#{Thread.CurrentThread.Name}");
}
}
}
}
实例1:窗体标签循环滚动
using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
namespace RollMove
{
public partial class Form1 : Form
{
Thread th1 = null;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
int _sx = 40;
int _ex = 280;
int _top = 70;
th1 = new Thread(() => {
while (true)
{
if (_sx <= _ex)
{
_ex = 280;
label1.Location = new Point(_sx, _top);
Thread.Sleep(20);
_sx += 5;
}
else
{
_ex = 40;
label1.Location = new Point(_sx, _top);
Thread.Sleep(20);
_sx -= 5;
}
}
});
th1.Start();
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if (th1!=null)
{
th1.Abort();
}
}
}
}
实例2:进度条
using System;
using System.Threading;
using System.Windows.Forms;
namespace month_9_10._1012
{
public partial class Form_3 : Form
{
public static Print.Print print = Console.WriteLine;
Thread th1, th2;
public Form_3()
{
InitializeComponent();
Text = "Welcome!";
CheckForIllegalCrossThreadCalls = false;
th1 = new Thread(new ThreadStart(Pro1));
th1.Priority = ThreadPriority.Lowest;
th1.Start();
th2 = new Thread(new ThreadStart(Pro2));
th2.Priority = ThreadPriority.Highest;
//th2.Start();
print(th1.Priority);
print(th2.Priority);
}
void Pro1()
{
print("XXXXXXX");
for (int i = 0; i <= 100; i++)
{
progressBar1.Value = i;
label1.Text = $"{progressBar1.Value}%";
Thread.Sleep(200);
if (i == 20)
{
th2.Start();
th2.Join();
}
}
}
void Pro2()
{
print("YYYYYYYY");
for (int i = 0; i <= 100; i++)
{
progressBar2.Value = i;
label2.Text = $"{progressBar2.Value}%";
Thread.Sleep(100);
}
}
private void progressBar1_Click(object sender, EventArgs e)
{
print("This is Main threading!");
}
private void Form_3_Load(object sender, EventArgs e)
{
}
private void Form_3_FormClosing_1(object sender, FormClosingEventArgs e)
{
if (th1.ThreadState == ThreadState.Running)
th1.Abort();
if (th2.ThreadState == ThreadState.Running)
th2.Abort();
}
}
}
实例三:线程同步(售票模拟)
using System;
using System.Threading;
namespace month_9_10._1012
{
class Run2
{
static Print.Print print = Console.WriteLine;
int _num = 10;
void Ticket()
{
while (true)
{
//上锁
//lock (this)
//{
// if (_num > 0)
// {
// Thread.Sleep(100);
// print(Thread.CurrentThread.Name + "--票数:" + _num--);
// }
//}
//放置监视器
Monitor.Enter(this);
if (_num > 0)
{
Thread.Sleep(100);
print(Thread.CurrentThread.Name + "--票数:" + _num--);
}
Monitor.Exit(this);
}
}
static void Main()
{
var a1 = new Run2();
Thread t1 = new Thread(new ThreadStart(a1.Ticket));
t1.Name = "线程一";
Thread t2 = new Thread(new ThreadStart(a1.Ticket));
t2.Name = "线程二";
Thread t3 = new Thread(new ThreadStart(a1.Ticket));
t3.Name = "线程三";
Thread t4 = new Thread(new ThreadStart(a1.Ticket));
t4.Name = "线程四";
t1.Start();
t2.Start();
t3.Start();
t4.Start();
}
}
}
来源:https://blog.csdn.net/qq_42292831/article/details/102472414


猜你喜欢
- 最近,项目上涉及到了图像压缩,发现原有的图像压缩功能,虽然保证了图像的大小300K以内,但是压缩后的图像看的不在清晰,并且,限定了图片的He
- For-Each循环For-Each循环也叫增强型的for循环,或者叫foreach循环。For-Each循环是JDK5.0的新特性(其他新
- C#实现修改文件的创建、修改和访问时间方法,主要是用到了File类的SetCreationTime、SetLastWriteTime、Set
- 近期遇到了DateTime到底是值类型还是引用类型的疑惑,顺势较深入地了解一下DateTime相关的内容结论:DateTime是值类型,因为
- 网上看了很多篇文章关于如何配置mybatis的logback日志的,复杂的简单的都有,但是有用的没几个,耽误了很多时间。通过对logback
- 如今,手机应用渗透到各行各业,数量难以计数,其中大多数应用都会使用到网络,与服务器的交互势不可挡,那么android当中访问网络有哪些方式呢
- SharedPreferences在开发过程中,数据存取是较为频繁的,今天我们来了解下android几种常见的数据存取方式。在Android
- 一、setting.xml文件的位置今天我们来谈谈Maven setting文件配置的禅定之道。不知道大家有没有听说过禅宗?嗯,没错,就是那
- android多线程断点下载,带进度条和百分比显示,断点下载的临时数据保存到SD卡的文本文档中,建议可以保存到本地数据库中,这样可以提高存取
- 下面通过图文并茂的方式给大家分享C#实现KTV点歌系统。public enum SongPlayState { //未播放,播放
- Java List转换成String数组实现代码:List<String> list = new ArrayList<St
- 写了一个过滤器,根据需要限制edittext输入的整数和小数位,如下代码:package allone.verbank.apad.clien
- 本文为大家分享了实现断点续传下载的具体代码,供大家参考,具体内容如下1、基于Ok+Rxjava实现断点续传下载2、基于Ok+Rxjava+R
- 一、事件背景个人感觉自己做性能测试,可以说是轻车熟路了,而且工作多年一直都是这一套测试思路及体系,从未质疑过自己,也许是狮子座的迷之自信吧!
- 如下,可以使用C#的Replace()方法来替换,但有一点需要注意的是backslash(反斜杠)是特殊字符。string s = &quo
- 简介ThreadPoolExecutor是一个实现ExecutorService接口的线程池,ExecutorService是主要用来处理多
- 本文实例讲述了Android实现EditText控件禁止输入内容的方法。分享给大家供大家参考,具体如下:问题:android如何实现Edit
- 本文实例为大家分享了C语言运用函数指针数组制作计算器的具体代码,供大家参考,具体内容如下先来回顾一下概念:指针数组 —— 存放指针的数组函数
- 对于Android中的手势识别可以从以下三个Listener入手——OnTouchListener、OnGestureListener、On
- 概述常用的弹窗有菜单,或者Dialog,但更加人性化和可自定义的还是PopupWindow如果只是展示列表数据或者弹窗列表选择,直接使用Li