最近在学习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. 网站引入外部js

    有时想看某个网站下一些数据,需要用到js做一个实时的筛选,却又苦于该网站没用jQuery导致想使用jQuery时,还无法下手,那么下面这段js或许可以帮助你.1.打开我们的chrome调试工具,切换到 ...

  2. 记录php漏洞--宇宙最强语言 PHP 爆出 DoS 漏洞,可以直接灌满 CPU

    站长之家(Chinaz.com)5月20日消息  近日,PHP被爆出存在远程DOS漏洞,若黑客利用该漏洞构造PoC发起连接,容易导致目标主机CPU被迅速消耗.此漏洞涉及众多PHP版本,因而影响范围极大 ...

  3. iOS —— GCD 详解

    一.什么是GCD Grand Central Dispatch (强大的中枢调度器) ,是异步执行任务的技术之一.纯C语言,有很多强大的函数. 二.GCD的优势 (1)GCD是苹果公司为多核并行运算提 ...

  4. javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较

    javascript数据结构与算法--基本排序算法(冒泡.选择.排序)及效率比较 一.数组测试平台. javascript数据结构与算法--基本排序(封装基本数组的操作),封装常规数组操作的函数,比如 ...

  5. (转) rabbitmq应用场景

    原文:http://blog.csdn.net/wangpengblog/article/details/76405598

  6. C++实现的字符串模糊匹配

    C++基本没有正则表达式功能,当然像Boost里提供了正则.本文来源于博客园园友的一篇文章,请看: C/C++ 字符串模糊匹配 很早之前就看过这篇文章,原作者的需求很明确.代码实现也很好. 之所以又写 ...

  7. ActiveMQ-在Centos7下安装和安全配置

    环境准备: JDK1.8 ActiveMQ-5.11 Centos7 1.下载Linux版本的ActiveMQ: $ wget http://apache.fayea.com/activemq/5.1 ...

  8. 【jQuery源码】select方法

    /** * select方法是Sizzle选择器包的核心方法之一,其主要完成下列任务: * 1.调用tokenize方法完成对选择器的解析 * 2.对于没有初始集合(即seed没有赋值)且是单一块选择 ...

  9. Attr.checkId()方法

    1.符号sym是TYP02 举个例子,如下: package bazola; class Point { // ... } class Tree<A> { class AttrVisito ...

  10. Nginx的进程

    传统上基于进程或线程模型架构的web服务通过每进程或每线程处理并发连接请求,这势必会在网络和I/O操作时产生阻塞,其另一个必然结果则是对内存或CPU的利用率低下.生成一个新的进程/线程需要事先备好其运 ...