C#如何进行多线程编程

由于多线程编程非常复杂,这个小例子只能算是一个入门线的知识点吧

首先建一个应用程序项目,命名为ThreadExample,在窗体上放一个文本框(textBox1) ,一个标签(lblResult),再放两个按钮,分别命名为btnStart、btnStop。

窗体代码:

namespace ThreadExample
{
    partial class ThreadExample
    {
        /**//// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

/**//// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

Windows Form Designer generated code#region Windows Form Designer generated code

/**//// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.btnStart = new System.Windows.Forms.Button();
            this.btnStop = new System.Windows.Forms.Button();
            this.button1 = new System.Windows.Forms.Button();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.lblResult = new System.Windows.Forms.Label();
            this.SuspendLayout();
            // 
            // btnStart
            // 
            this.btnStart.Location = new System.Drawing.Point(14, 38);
            this.btnStart.Name = "btnStart";
            this.btnStart.Size = new System.Drawing.Size(75, 23);
            this.btnStart.TabIndex = 0;
            this.btnStart.Text = "启动";
            this.btnStart.Click += new System.EventHandler(this.btnStart_Click);
            // 
            // btnStop
            // 
            this.btnStop.Location = new System.Drawing.Point(14, 68);
            this.btnStop.Name = "btnStop";
            this.btnStop.Size = new System.Drawing.Size(75, 23);
            this.btnStop.TabIndex = 1;
            this.btnStop.Text = "停止";
            this.btnStop.Click += new System.EventHandler(this.btnStop_Click);
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(14, 97);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 3;
            this.button1.Text = "关闭";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(14, 11);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(75, 21);
            this.textBox1.TabIndex = 4;
            this.textBox1.Text = "200";
            // 
            // lblResult
            // 
            this.lblResult.AutoSize = true;
            this.lblResult.Location = new System.Drawing.Point(12, 139);
            this.lblResult.Name = "lblResult";
            this.lblResult.Size = new System.Drawing.Size(23, 12);
            this.lblResult.TabIndex = 5;
            this.lblResult.Text = "0/0";
            // 
            // ThreadExample
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(104, 164);
            this.Controls.Add(this.lblResult);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.btnStop);
            this.Controls.Add(this.btnStart);
            this.Name = "ThreadExample";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();

}

#endregion

private System.Windows.Forms.Button btnStart;
        private System.Windows.Forms.Button btnStop;
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.Label lblResult;
    }
}

程序代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace ThreadExample
{
    public partial class ThreadExample : Form
    {
        //声明一个线程
        private Thread timerThread;
        //声明一个变量,用来存储label值
        int count, i = 0;

public ThreadExample()
        {
            InitializeComponent();
        }

//把label的值加1;
        public void AddData()
        {
            //显示lable的值
            if (i == count)
                i = 0;
            this.lblResult.Text = i.ToString() + "/" + count.ToString();
            i++;
        }

//更新线程
        public void UpdataThread()
        {
            try
            {
                //在对控件的调用方法进行调用时,或需要一个简单委托又不想自己定义时可以使用该委托。
                MethodInvoker mi = new MethodInvoker(this.AddData);
                while (true)
                {
                    //在创建控件的基础句柄所在线程上异步执行指定的委托
                    this.BeginInvoke(mi);
                    Thread.Sleep(50);
                }
            }
            catch (ThreadInterruptedException)
            {
                //针对具体问题定制异常抛出显示
            }
            finally
            {
                //做一些处理
            }
        }

//启动线程
        public void StartThread()
        {
            StopThread();
            timerThread = new Thread(new ThreadStart(UpdataThread));
            //获取或设置一个值,该值指示某个线程是否为后台线程。
            timerThread.IsBackground = true;
            timerThread.Start();
        }

//停止线程
        public void StopThread()
        {
            if (timerThread != null)
            {
                //中断线程
                timerThread.Interrupt();
                timerThread = null;
            }
        }

//启动线程,显示结果
        private void btnStart_Click(object sender, EventArgs e)
        {
            //调用线程启动函数
            count = int.Parse(textBox1.Text);
            this.StartThread();
        }

//停止线程
        private void btnStop_Click(object sender, EventArgs e)
        {
            //调用线程停止函数
            this.StopThread();
        }       
    }
}

编译后,运行,在文本框中输入200,点击开始按钮,标签为动态增长,点击停止可以暫停程序的执行。

C#如何进行多线程编程相关推荐

  1. C 多线程编程之在类中使用多线程(thread)的方法

    一.thread的基本用法 参见C++使用thread类多线程编程 . 二.类外使用多线程,访问类的成员 这几种方式,新建线程都是在类外,然后通过把友元函数或者成员函数作为thread参数. #inc ...

  2. Linux多线程管理: 多线程编程

    多线程编程 mind-Mapping保存有一下导图的xmind文件,可直接获取 互斥变量 互斥对象 ptrhead相关接口 条件变量 future异步访问类 async类 promise类 packa ...

  3. [转]Linux 的多线程编程的高效开发经验

    Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别.不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断.本文中我们 ...

  4. Java多线程编程实战:模拟大量数据同步

    背景 最近对于 Java 多线程做了一段时间的学习,笔者一直认为,学习东西就是要应用到实际的业务需求中的.否则要么无法深入理解,要么硬生生地套用技术只是达到炫技的效果. 不过笔者仍旧认为自己对于多线程 ...

  5. 20180829-Java多线程编程

    Java 多线程编程 Java给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分. 程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 多线程是多任务的一种特 ...

  6. java多线程编程01---------基本概念

    一. java多线程编程基本概念--------基本概念 java多线程可以说是java基础中相对较难的部分,尤其是对于小白,次一系列文章的将会对多线程编程及其原理进行介绍,希望对正在多线程中碰壁的小 ...

  7. 如何实现C++中的多线程编程

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文整理自:知乎用户yikang知乎专栏 Part 1. 基本概念 ...

  8. 多线程编程有什么用途_C++ 多线程编程 (一)

    What is thread? In computer science, a thread of execution is the smallest sequence of programmed in ...

  9. 多线程编程1-NSThread

    前言 每个iOS应用程序都有个专门用来更新显示UI界面.处理用户触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验.一般的解决方案就 ...

  10. Linux下不使用qt自带sleep,Linux下Qt多线程编程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 作者:武汉华嵌嵌入式培训中心 技术部 以下和大家分享Linux平台下Qt两种多线程编程的方式: 1.使用Linux平台下的线程函数.以下是给出的代码片段: ...

最新文章

  1. CSAPP lab2 二进制拆弹 binary bombs phase_6
  2. Ajax请求Session超时的解决办法:拦截器 + 封装jquery的post方法
  3. Magento利用input type=”file”上传图片
  4. mPaas 厂商 push 不通排查指南
  5. 如何开发Web应用程序(非网站)
  6. 电脑知识:Win10系统把系统盘的软件移到D盘的简单方法
  7. deepdive连接mysql数据库_如何从Error Code获取Message
  8. Python+OpenCV:基于色彩空间转换的目标跟踪
  9. C#笔记01 课程总论
  10. 找最长的字符串 (15 分)
  11. 四个免费好用的临时邮箱
  12. SAP中客户需求(销售订单)在计划策略10/30/40下的区别测试
  13. 谷歌十年愚人节,「玩笑」背后是美好生活的企盼
  14. LightOJ - 1406 Assassin`s Creed【状压DP】
  15. 未来职业世界的三种人
  16. 去中心化和p2p网络以及中心化为核心的传统通信
  17. chrome谷歌浏览器安装插件
  18. 按F12才能进入开机界面(戴尔游匣7559)
  19. 微信小程序(五)--- Vant组件库,API Promise化,MboX全局数据共享,分包相关
  20. 锐捷文件描述错误linux,Kubuntu 14.10 MentoHUST 配置libpcap 锐捷校园网登录总结

热门文章

  1. 业界丨2018年能干大事儿的5家人工智能初创公司
  2. Python 之 matplotlib (十)Image
  3. The following packages will be SUPERCEDED by a higher-priority channel
  4. 宇宙和世界真的是虚拟的吗?
  5. 盘点|应用落地,构建城市“大脑”
  6. 李开复对话彭特兰:AI 不是单打独斗,应避免 AI 冷战!
  7. 关于授予81项成果2019年度“吴文俊人工智能科学技术奖”的决定
  8. 华为发布 AR 地图技术,但最佳的运行设备不是手机
  9. 《全球人工智能发展报告(2018)》发布:一览全球AI领域竞争态势
  10. 争议中挺进全新里程——中国“超级对撞机”《概念设计报告》发布侧记