最近在学习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. 队列(循环队列)----C语言

    线性结构:有且只有一个根节点,且每个节点最多有一个直接前驱和一个直接后继的非空数据结构 非线性结构:不满足线性结构的数据结构 队列 队列一般分为两类:链式队列和顺序队列 链式队列---链式队列即用链表 ...

  2. libevent源码剖析

    libevent是一个使用C语言编写的,轻量级的开源高性能网络库,使用者很多,研究者也很多.由于代码简洁,设计思想简明巧妙,因此很适合用来学习,提升自己C语言的能力. libevent有这样显著地几个 ...

  3. [bug] JS sort 函数在 ios 中无效

    首先,请原谅我做一次标题党: 但我觉得从发现问题到最后解决问题的过程还是蛮有意思的,特此记录一下: 背景 近两天开发的航班延误宝是内嵌在客户端(android.ios)webview 中的 H5 页面 ...

  4. Android之开源项目汇总

    汇总一:http://www.trinea.cn/android/android-open-source-projects-view/ 汇总二:http://blog.csdn.net/liuhaom ...

  5. Swinject 源码框架(二):循环依赖的解决

    可能存在循环依赖,比如 Parent 强制有 Child, Child 弱持有 Parent. 具体实现如下.Parent 初始化时,必须传入 Child,而 Child 初始化不必传入 Parent ...

  6. POJ 1260

    //状态转移方程: F[i] = min{f[k] + (a[k+1]+………+a[i]+10} * p[i]} #include <iostream> #define MAXN 105 ...

  7. 巧用border特性实现聊天气泡效果

    利用border特性,实现三角形,很简单,我们直接看效果: html: <div class="bubble-container ">你好么 <div class ...

  8. SpringMVC路径匹配规则AntPathMatcher

    前言 本文是基于Spring Framework 4.3.3分析. 正文 SpringMVC的路径匹配规则是依照Ant的来的. 实际上不只是SpringMVC,整个Spring框架的路径解析都是按照A ...

  9. 常用CSS实例

    为表格设置合并边框模型: border-collapse:collapse 规定单元格之间的空间: cellspacing:0 规定内侧边框的哪个部分是可见的: rules:all

  10. GCC 编译 Windows API 程序

    前言 这学期学可视化程序设计,要使用 Windows API 绘制界面,由于笔者的笔记本硬盘太小,无法装臃肿的 VS(主要是不想装),也不想用 VC++ 6.0,所以就选用 GCC 来编译. 安装 m ...