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)提高并发性.通过线程可方便有效地实现并发性.进程可创建多个线程 ...
随机推荐
- 复制表结构和内容到另一张表中的SQL语句
1.复制表结构及数据到新表 CREATE TABLE 新表 SELECT * FROM 旧表 2.只复制表结构到新表 CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1= ...
- hdu4462--曼哈顿距离
题目大意:有N*N个点的田野,然后有k个点是用来放稻草人的,每个稻草人对周围满足曼哈顿距离的庄稼有保护作用 问最小的稻草人的个数能够保护所有庄稼,如果不能保护则输出-1 注意的地方: 1.放稻草人的点 ...
- robot framework —— 变量文件
何为变量文件? 变量文件中包含了测试数据中的变量.虽然变量可以通过变量表格中创建, 或者通过命令行设置, 不过这些方法有所局限, 而变量文件可以动态地创建任意类型的变量. 变量文件一般由Python模 ...
- 【北京】安全研究员/工程师-20-35K,人体工程学座椅坐等你来~
招聘地点:北京市西城区 薪资:20-35K 人体工程学座椅,高大上环境坐等你来 [招聘]安全研究员+安全工程师-北京数字观星科技有限公司 北京数字观星科技有限公司成立于2016年9月29日,是一家致力 ...
- ubuntu14.04 安装五笔输入法(fcitx)
ubuntu 14.04安装完成之后,一打字,默认的ibus一直在显示.解决办法,直接卸载ibus,使用fcitx. fictix拼音有fcitx-pinyin.fcitx-sogoupinyin.f ...
- maven安装以及eclipse配置maven
详细地址: http://jingyan.baidu.com/article/295430f136e8e00c7e0050b9.html 介绍安装maven,配置Maven环境变量,同时在Eclips ...
- POJ 1157
#include<iostream> //成大才子---经典代码~ #include<stdio.h> #include<algorithm> #define MA ...
- SQL Server 数据库存储过程实例
USE [UFDATA_999_2014] GO /****** Object: StoredProcedure [dbo].[p_XMonPerNums] Script Date: 06/12/20 ...
- Centos7下安装zabbix 3.0.19
参考网站: https://www.cnblogs.com/xiewenming/p/7732144.html https://www.cnblogs.com/clsn/p/7885990.html ...
- css之px自动转rem—sublime 插件CSSREM
CSSREM CSSREM 是一个CSS的 px 值转 rem 值的Sublime Text3自动完成插件.先来看看插件的效果: 一个CSS的px值转rem值的Sublime Text 3自动完成插件 ...