WinForm窗体多线程操作实例
最近在学习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窗体多线程操作实例的更多相关文章
- Winform 窗体的操作
原文:http://www.cnblogs.com/Billy-rao/archive/2012/05/16/2503437.html 怎样能使winform窗体的大小固定住,不能调整其大小 窗体Fo ...
- C# 多线程操作实例
1.多线程操作 一旦打开线程就必须记得关闭 1.第一部分 这是个数字叠加小功能 private void CountTo(int countTo, CancellationToken ct) { ; ...
- C# winform编程中多线程操作控件方法
private void Form1_Load(object sender, EventArgs e) { Thread newthread = new Thread(new ThreadStart( ...
- 【winform】主窗体多线程给子窗体传值
1.主窗体多线程给子窗体传值 解决方案:主要使用委托,因为会出现跨线程错误 主窗体 public FormMain() { InitializeComponent(); //background th ...
- C#多线程编程实例 线程与窗体交互
C#多线程编程实例 线程与窗体交互 代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = ]; public ...
- c# Winform 多线程操作
主要是对一个过程需要的时间很长执行时会出现界面假死的情况 方法1: Application.DoEvents(),这种方法当你拖动窗体时,界面不会假死.但在你拖动时代码不再执行,也就是阻塞了,当你不再 ...
- 编写Java程序,实现多线程操作同一个实例变量的操作会引发多线程并发的安全问题。
查看本章节 查看作业目录 需求说明: 多线程操作同一个实例变量的操作会引发多线程并发的安全问题.现有 3 个线程代表 3 只猴子,对类中的一个整型变量 count(代表花的总数,共 20 朵花)进行操 ...
- C#多线程操作界面控件的解决方案(转)
C#中利用委托实现多线程跨线程操作 - 张小鱼 2010-10-22 08:38 在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了 ...
- winform窗体 小程序【线程】
线程是进程中执行运算的最小单位,也是执行处理机调度的基本单位.实际上线程是轻量级的进程.那么为什么要使用线程呢? (1)易于调度. (2)提高并发性.通过线程可方便有效地实现并发性.进程可创建多个线程 ...
随机推荐
- 935. Knight Dialer
A chess knight can move as indicated in the chess diagram below: . This time, we place o ...
- jzoj1407
首先設在整個數組內可以直接到達n+1的最左邊的點點為x 則x+1-n區間都可以一次或2次到達n+1 如果某一個點i可以一次到達n+1,則其i+a[i]大於等於n+1 否則可以先跳到i再跳到n+1,需要 ...
- 用node.js写一个简单爬虫,并将数据导出为 excel 文件
引子 最近折腾node,最开始像无头苍蝇一样到处找资料,然而多数没什么卵用,都在瞎比比.在一阵瞎搞后,我来分享一下初步学习node的三个过程: 1 撸一遍NODE入门,对其有个基本的了解: 2 撸一遍 ...
- JAVA并发编程学习笔记------结构化并发应用程序
1. Executor基于生产者-消费者模式,提交任务的操作相当于生产者,执行任务的线程相当于消费者,如果要在程序中实现一个生产者-消费者的设计,最简单的方式通常就是使用Executor 2. Exe ...
- (原创)JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别
阻塞队列:线程安全 按 FIFO(先进先出)排序元素.队列的头部 是在队列中时间最长的元素.队列的尾部 是在队列中时间最短的元素.新元素插入到队列的尾部,并且队列检索操作会获得位于队列头部的元素.链接 ...
- python学习笔记08-字符串
字符串是用单引号或者双引号引起来来的 单引号和双引号没有什么区别 1字符串支持乘法操作 >>> print('hello'*2) hellohello >>> 2 ...
- Excel中复杂跨行跨列数据
XSSFWorkbook wb = new XSSFWorkbook(); // 工作表 XSSFSheet sheet = wb.createSheet("车辆使用情况统计"); ...
- jboss8+EJB3+MDB Queue
1)在使用jboss8即WildFly进行MDB的试验时首先要在jboss8中配置jms 队列. 我使用的是修改配置文件的方式配置Jms Queue队列. 进入jboss8 安装目录的standalo ...
- APP 渠道推广【摘自网络】
渠道的合作方式无非三种,一种是付费合作,那很简单,谈好价格付钱.第二种是免费,主要是就是首发,还有就是跟渠道的运营小伙伴搞好关系让帮忙给个免费的位置等,第三种是活动奖品合作,简而言之,就是渠道商会逢年 ...
- win7使用命令
osk 屏幕键盘 perfmon 性能监视器 PresentationSettings 演示设置 recdisc.exe 创建系统恢复光盘 regedt32 注册表编辑器 rekeywiz 加密文件系 ...