using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading; // Thread
namespace duo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// 不使用匿名函数
public void fun1()
{
Thread.Sleep(3000);
MessageBox.Show("素菜做好了");
Thread.Sleep(3000);
MessageBox.Show("荤菜做好了");
}
public void fun2()
{
Thread.Sleep(2000);
MessageBox.Show("荤菜做好了");
}
public void fun3()
{
Thread.Sleep(3000);
MessageBox.Show("素菜做好了");
}
public void pring()
{
MessageBox.Show("菜都做好了,来吃饭吧");
}
// 未使用线程 (匿名函数)
private void button1_Click(object sender, EventArgs e)
{
Thread.Sleep(3000);
MessageBox.Show("素菜做好了");
Thread.Sleep(3000);
MessageBox.Show("荤菜做好了");
}
// 启动单个线程(方式一)
private void button2_Click(object sender, EventArgs e)
{
// 调用函数(不使用匿名函数)
Thread t1 = new Thread(fun1);
t1.Start();
// 匿名函数 可以是() 也可以任意定义变量名
Thread t2 = new Thread(f => {
Thread.Sleep(3000);
MessageBox.Show("素菜做好了");
Thread.Sleep(3000);
MessageBox.Show("荤菜做好了");
});
t2.Start();
}
// 启动单个线程(方式二)
private void button4_Click(object sender, EventArgs e)
{
// 调用函数
// 默认线程池
Task.Run(() => fun1());
}
// 按顺序等待线程执行结束后,再运行后面代码
private async void button5_Click(object sender, EventArgs e)
{
await Task.Run(() => fun2());
await Task.Run(() => fun3());
MessageBox.Show("菜都做好了,来吃饭吧");
}
private void button3_Click(object sender, EventArgs e)
{
// 创建列表 放入线程对象
List<Task> ts = new List<Task>();
ts.Add(Task.Run(() => fun2()));
ts.Add(Task.Run(() => fun3()));
// 运行多线程(必须有一个任意变量名)
Task.WhenAll(ts).ContinueWith(t => pring());
}
//
}
}
感谢up主的分享:
视频教学连接:
运行、停止、创建、取消、
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
// 多线程
using System.Threading;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// 禁止捕获对错误线程的调用(不推荐)
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
}
// 创建内存空间 模拟事件 暂停或运行 线程
ManualResetEvent m;
// 创建内存空间 取消线程
CancellationTokenSource tokenSource;
// 创建线程按钮
private void button1_Click(object sender, EventArgs e)
{
// 取消线程令牌的工厂
tokenSource = new CancellationTokenSource();
// 取消线程令牌的创建
CancellationToken cancellationToken = tokenSource.Token;
// 模拟事件 创建
m = new ManualResetEvent(true);
// 创建多线程工程 开始运行
Task.Factory.StartNew(() =>
{
for (int k = 0; k < 100; k++)
{
// 判断取消令牌是否生效
if (cancellationToken.IsCancellationRequested)
{
return;
}
// 暂停 或 继续
m.WaitOne();
// 显示数字
textBox1.Text = k.ToString();
Thread.Sleep(500);
}
},cancellationToken);
}
// 暂停线程按钮
private void button2_Click(object sender, EventArgs e)
{
m.Reset();
}
// 继续线程按钮
private void button3_Click(object sender, EventArgs e)
{
m.Set();
}
// 取消线程按钮
private void button4_Click(object sender, EventArgs e)
{
// 立即取消线程
tokenSource.Cancel();
// 归零
textBox1.Text = "0";
// 延时取消线程
//tokenSource.CancelAfter(3000);
// 如果使用延时取消, 归零无效
//textBox1.Text = "0";
//
}
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sarr.cn 版权所有 赣ICP备2024042794号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务