您好,欢迎来到飒榕旅游知识分享网。
搜索
您的当前位置:首页C# 多线程示例

C# 多线程示例

来源:飒榕旅游知识分享网

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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务