最近在学习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;
using System.Threading.Tasks;
using System.Windows.Forms; namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} //声明线程数组1
Thread[] thread1 = new Thread[]; //声明线程数组2
Thread[] thread2 = new Thread[]; //声明委托,为listbox1增加Item
delegate void AddItemMethod1(string txt); //声明委托,为listbox2增加Item
delegate void AddItemMethod2(string txt); //利用线程为Listbox1添加内容
private void AddItem1(string txt)
{
if (this.InvokeRequired)
{
AddItemMethod1 d = new AddItemMethod1(AddItem1);
this.Invoke(d, new object[] { txt });
}
else
{
this.listBox1.Items.Add(txt);
}
} //利用线程为Listbox2添加内容
private void AddItem2(string txt)
{
if (this.InvokeRequired)
{
AddItemMethod2 d = new AddItemMethod2(AddItem2);
this.Invoke(d, new object[] { txt });
}
else
{
this.listBox2.Items.Add(txt);
}
} //生成Item
public void GetItem1()
{
while (true)
{
AddItem1("OK");
Thread.Sleep();
}
} //生成Item
public void GetItem2()
{
while (true)
{
AddItem2("NICE");
Thread.Sleep();
}
} private void button1_Click(object sender, EventArgs e)
{
////循环创建并启动线程1
for (int i = ; i < thread1.Length; i++)
{
if (thread1[i] == null)//线程不存在
{
thread1[i] = new Thread(new ThreadStart(() =>
{
while (true)
{
AddItem1("OK");
Thread.Sleep();
//listbox1 的Item数量到20个是停止thread1
if (listBox1.Items.Count >)
{ if (i >= thread1.Length)
{
i = thread1.Length - ;
}
//如果不加上面的判断,下面就会提示索引超出数组长度界限,我定义了thread1 的线程个数是1个,for循环中i为1的情况应该是进不来的,为啥
// 下面的i会是1??
thread1[i].Abort();
}
}
}));
thread1[i].Name = i.ToString();
thread1[i].Start();
}
else
{
//已经存在,如果没有运行,则启动
if (thread1[i].ThreadState == ThreadState.Aborted || thread1[i].ThreadState == ThreadState.Stopped)
{
thread1[i] = new Thread(new ThreadStart(GetItem1));
thread1[i].Name = i.ToString();
thread1[i].Start();
}
else
{
thread1[i].Start();
}
}
} ////循环创建并启动线程2
for (int j = ; j < thread2.Length; j++)
{
if (thread2[j] == null)//线程不存在
{
thread2[j] = new Thread(new ThreadStart(GetItem2));
thread2[j].Name = j.ToString();
thread2[j].Start();
}
else
{
//已经存在,如果没有运行,则启动
if (thread2[j].ThreadState == ThreadState.Aborted || thread2[j].ThreadState == ThreadState.Stopped)
{
thread2[j] = new Thread(new ThreadStart(GetItem2));
thread2[j].Name = j.ToString();
thread2[j].Start();
}
else
{
thread2[j].Start();
}
}
}
} private void button2_Click(object sender, EventArgs e)
{
//循环停止线程1执行
for (int i = ; i < thread1.Length; i++)
{
//如果线程存在,并且状态不是停止也不是终止的,则终止该线程
if (thread1[i] != null && thread1[i].ThreadState != ThreadState.Stopped && thread1[i].ThreadState != ThreadState.Aborted)
{
thread1[i].Abort();
}
} //循环停止线程2执行
for (int j = ; j < thread2.Length; j++)
{
//如果线程存在,并且状态不是停止也不是终止的,则终止该线程
if (thread2[j] != null && thread2[j].ThreadState != ThreadState.Stopped && thread2[j].ThreadState != ThreadState.Aborted)
{
thread2[j].Abort();
}
}
}
}
}

WinForm窗体多线程操作实例的更多相关文章

  1. Winform 窗体的操作

    原文:http://www.cnblogs.com/Billy-rao/archive/2012/05/16/2503437.html 怎样能使winform窗体的大小固定住,不能调整其大小 窗体Fo ...

  2. C# 多线程操作实例

    1.多线程操作 一旦打开线程就必须记得关闭 1.第一部分 这是个数字叠加小功能 private void CountTo(int countTo, CancellationToken ct) { ; ...

  3. C# winform编程中多线程操作控件方法

    private void Form1_Load(object sender, EventArgs e) { Thread newthread = new Thread(new ThreadStart( ...

  4. 【winform】主窗体多线程给子窗体传值

    1.主窗体多线程给子窗体传值 解决方案:主要使用委托,因为会出现跨线程错误 主窗体 public FormMain() { InitializeComponent(); //background th ...

  5. C#多线程编程实例 线程与窗体交互

    C#多线程编程实例 线程与窗体交互 代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = ]; public ...

  6. c# Winform 多线程操作

    主要是对一个过程需要的时间很长执行时会出现界面假死的情况 方法1: Application.DoEvents(),这种方法当你拖动窗体时,界面不会假死.但在你拖动时代码不再执行,也就是阻塞了,当你不再 ...

  7. 编写Java程序,实现多线程操作同一个实例变量的操作会引发多线程并发的安全问题。

    查看本章节 查看作业目录 需求说明: 多线程操作同一个实例变量的操作会引发多线程并发的安全问题.现有 3 个线程代表 3 只猴子,对类中的一个整型变量 count(代表花的总数,共 20 朵花)进行操 ...

  8. C#多线程操作界面控件的解决方案(转)

    C#中利用委托实现多线程跨线程操作 - 张小鱼 2010-10-22 08:38 在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了 ...

  9. winform窗体 小程序【线程】

    线程是进程中执行运算的最小单位,也是执行处理机调度的基本单位.实际上线程是轻量级的进程.那么为什么要使用线程呢? (1)易于调度. (2)提高并发性.通过线程可方便有效地实现并发性.进程可创建多个线程 ...

随机推荐

  1. PHP 单点登录实现方案

    单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任.单点登录在大型网站里使用得 ...

  2. Java的HashMap

    FAQ: 为什么要有HashMap? 答:我非常期待能在Java 中使用Hash表 这种数据结构 ,因为它的快速存取特性. Hash表 和HashMap的关系? 答:Hash表 是一种逻辑数据结构,H ...

  3. 微信小程序redirect 到tab不刷新

    // 更新2018/11/20:现在小程序的页面栈长度为10 更正 2018/11/20: 经过一段时间的实践,我发现以前方法存在很多问题,比如 getCurrentPages 方法并不在官方的 AP ...

  4. nginx请求频率限制模块ngx_http_limit_req_module

    模块: ngx_http_limit_req_module 作用: 限制客户端请求频率,防止恶意攻击 配置示例: http { limit_req_zone $binary_remote_addr z ...

  5. linux查看防火墙状态及开启关闭命令

    存在以下两种方式: 一.service方式 查看防火墙状态: [root@centos6 ~]# service iptables status iptables:未运行防火墙. 开启防火墙: [ro ...

  6. day 64 crm项目(1) admin组件的初识别以及应用

    前情提要: 今天进入项目学习阶段,crm 一个又老又土又实用的入门项目 一:django回顾 二:事前准备 1:首先创建django项目 2:在model中创建数据 from django.db im ...

  7. day 51 随机验证码, 验证登陆 ,以及 装饰器在函数中的应用

    前端很好的session 的例子 (随机验证码登陆) https://github.com/Endless-Clould/qianduan 参考: 验证码登录 https://www.cnblogs. ...

  8. pg_stat_statements跳过的坑

    pg_stat_statements跳过的坑 原本以为只是一个简单的插件扩展安装,三下五除二就能搞定,结果搞了很久也没找到问题所在.首先pg_stat_statements已经安装成功,且已经能够使用 ...

  9. Hadoop2.2.0安装笔记

    最近想学习hadoop,于是网上找了些教程学习,几经周折,总算安装成功了! 先讲下环境,就2台机器...都是vmware虚拟机,操作系统centos, jdk版本 1.8.0 hadoop版本 2.2 ...

  10. 微服务是"银弹"吗?

    前言:所谓"银弹",本意是用金属银做成的子弹:在古老的传说里它是杀死狼人的有效武器.在著作<人月神话>也有描述.微服务是当前软件界流行的名词,那么它能成为像银弹一样厉害 ...