winform基于异步委托实现多线程摇奖器

本文实例讲述了winform基于异步委托实现多线程摇奖器。分享给大家供大家参考。具体实现方法如下:

代码如下:

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 _08_摇奖机
{
//创建六个invoke方法(控件调用的时候的委托,用来给lable控件赋值)
public delegate void MyDelegate1(int num);
public delegate void MyDelegate2(int num);
public delegate void MyDelegate3(int num);
public delegate void MyDelegate4(int num);
public delegate void MyDelegate5(int num);
public delegate void MyDelegate6(int num);
public partial class Form1 : Form
{
public MyDelegate1 md1;
public MyDelegate1 md2;
public MyDelegate1 md3;
public MyDelegate1 md4;
public MyDelegate1 md5;
public MyDelegate1 md6;
//此委托用来作异步委托,旨在让clr自动创建另一个线程来完成主线程要做的操作,以缓解主线程的压力
public delegate void MyDelegate(bool b);
public Form1()
{
InitializeComponent();
md1 = SetLable1;
md2 = SetLable2;
md3 = SetLable3;
md4 = SetLable4;
md5 = SetLable5;
md6 = SetLable6;
}
//用来存放子线程对象
private Thread nameThread;
private int id;
private void button1_Click(object sender, EventArgs e)
{
MyDelegate md = new MyDelegate(this.SetNumberData);;
if (button1.Text.Trim()=="开始")
{
button1.Text = "停止";
//调用异步委托,就是在另一个线程中执行此委托绑定的方法
IAsyncResult result = md.BeginInvoke(true,null, null);
}
else
{
button1.Text = "开始";
//停止的话就相当于终止子线程
nameThread.Abort();
}

//首先要想清楚 要给主线程的空间lable赋值,那么就必须是主线程干的事

//md.EndInvoke(result);
}

public void SetNumberData(bool b)
{
while (b==true)
{
List<int> listNum = new List<int>();
Random random = new Random();
//随机生成6个数
while (listNum.Count <= 6)
{
int n = random.Next(0, 10);
listNum.Add(n);
}
//不是创建此控件的线程调用此控件的时候就必须调用invoke方法
if (this.label1.InvokeRequired)
{
this.Invoke(md1, listNum[0]);
}
else
{
label1.Text = listNum[0].ToString();
}
if (this.label2.InvokeRequired)
{
this.Invoke(md2, listNum[1]);
}
else
{
label2.Text = listNum[1].ToString();
}
if (this.label3.InvokeRequired)
{
this.Invoke(md3, listNum[2]);
}
else
{
label3.Text = listNum[2].ToString();
}
if (this.label4.InvokeRequired)
{
this.Invoke(md4, listNum[3]);
}
else
{
label4.Text = listNum[3].ToString();
}
if (this.label5.InvokeRequired)
{
this.Invoke(md5, listNum[4]);
}
else
{
label5.Text = listNum[4].ToString();
}
if (this.label6.InvokeRequired)
{
this.Invoke(md6, listNum[5]);
}
else
{
label6.Text = listNum[5].ToString();
}
//记录下当前的线程对象,以便于在点击停止按钮的时候终止此线程
nameThread = Thread.CurrentThread;
Thread.Sleep(300);
}
//id=Thread.CurrentThread.ManagedThreadId;

}

public void SetLable1(int n)
{
label1.Text = n.ToString();
}
public void SetLable2(int n)
{
label2.Text = n.ToString();
}
public void SetLable3(int n)
{
label3.Text = n.ToString();
}
public void SetLable4(int n)
{
label4.Text = n.ToString();
}
public void SetLable5(int n)
{
label5.Text = n.ToString();
}
public void SetLable6(int n)
{
label6.Text = n.ToString();
}
}

程序运行结果如下所示:

希望本文所述对大家的C#程序设计有所帮助。

(0)

相关推荐

  • Winform基于多线程实现每隔1分钟执行一段代码

    本文实例讲述了Winform基于多线程实现每隔1分钟执行一段代码的方法,分享给大家供大家参考.具体实现方法如下: 1.定义相关的类Timer.cs,代码如下: 复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace SMIS2013.DSS.Monitor {     public class

  • WinForm实现跨进程通信的方法

    本文实例展示了WinForm实现跨进程通信的方法,分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: public class WinMessageHelper { private struct COPYDATASTRUCT { public IntPtr dwData; public int cbData; [MarshalAs(UnmanagedType.LPStr)] public string lpData; } //使用COPYDATA进行跨进程通信 public const

  • 深入浅析WinForm 进程、线程及区别介绍

    一.进程 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动. 它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体. Process 类,用来操作进程. 命名空间:using System.Diagnostics; Process.Start("calc"); //打开计算器 Process.Start("mspaint"); //打开画图 Process.Start("iexplore" , "http://www.

  • c# winform多线程的小例子

    在文本框中输入一个数字,点击开始累加按钮,程序计算从1开始累计到该数字的结果.因为该累加过程比较耗时,如果直接在UI线程中进行,那么当前窗口将出现假死.为了有更好的用户体验,程序启动一个新的线程来单独执行该计算,然后每隔200毫秒读取一次累加结果,并把结果显示到文本框下方的label控件中.同时,程序支持取消操作,点击取消累计按钮,程序将取消累加操作,并把当前累加值显示到label中.为了方便后面的描述,我把UI线程称作主线程,把执行累加计算的线程称作工作者线程.该过程有两个关键点: 1:如何在

  • winform开发使用通用多线程基类分享(以队列形式)

    复制代码 代码如下: /// <summary>    /// 队列多线程,T 代表处理的单个类型~    /// </summary>    /// <typeparam name="T"></typeparam>    public abstract class QueueThreadBase<T>    {        #region 变量&属性        /// <summary>      

  • c# winform 关闭窗体时同时结束线程实现思路

    前不久,做一个winform小程序,是给客户导数据用的.当时就发现调试的时候,线程有点问题,到某个点时就走不动了.但是运行确实没有问题的. 只是在关闭窗体后,资源管理器里,一大堆进程. 当时,客户急着用,小测了下,导出数据无误,进程就先不管了. 后来自己去查资料,发现只要在线程那里设置个属性 复制代码 代码如下: Thread th = new Thread(Excute); th.IsBackground = true;这样就解决问题了. 这个属性的意思就是把线程设置为后台线程. 然后关闭进程

  • c#中多线程访问winform控件的若干问题小结

    我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来解决这个问题,下面我将详细的介绍. 首先来看传统方法: 复制代码 代码如下: public partial class Form1 : Form     {        public Form1()        {            InitializeComponent();        } private void Form1_Load(object sender,

  • winform基于异步委托实现多线程摇奖器

    本文实例讲述了winform基于异步委托实现多线程摇奖器.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: 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 Sys

  • C#基于委托实现多线程之间操作的方法

    本文实例讲述了C#基于委托实现多线程之间操作的方法.分享给大家供大家参考,具体如下: 有的时候我们要起多个线程,更多的时候可能会有某个线程会去操作其他线程里的属性. 但是线程是并发的,一般的调用是无法实现我们的要求的. 于是,我们在这里就可以用委托,代码如下 private delegate void DelegateInfo(); private delegate void DelegateIsEnd(); //这个是线程调用其他线程的方法 private void Dowork() { //

  • c#并行任务多种优化方案分享(异步委托)

    遇到一个多线程任务优化的问题,现在解决了,分享如下. 假设有四个任务: 任务1:登陆验证(CheckUser) 任务2:验证成功后从Web服务获取数据(GetDataFromWeb) 任务3:验证成功后从数据库获取数据(GetDatFromDb) 任务4:使用2.3的数据执行一个方法 (StartProcess) 一个比较笨的方法(本人最开始的方法,记为方法1)是直接开启一个线程,按照顺序依次执行四个任务: 复制代码 代码如下: new Thread(delegate              

  • python基于concurrent模块实现多线程

    引言 之前也写过多线程的博客,用的是 threading ,今天来讲下 python 的另外一个自带库 concurrent .concurrent 是在 Python3.2 中引入的,只用几行代码就可以编写出线程池/进程池,并且计算型任务效率和 mutiprocessing.pool 提供的 poll 和 ThreadPoll 相比不分伯仲,而且在 IO 型任务由于引入了 Future 的概念效率要高数倍.而 threading 的话还要自己维护相关的队列防止死锁,代码的可读性也会下降,相反

  • C#异步委托调用实例分析

    本文实例讲述了C#异步委托调用实现方法.分享给大家供大家参考.具体如下: static void Main(string[] args) { //委托异步 Action<string> showMessage = ShowMessage; IAsyncResult result = showMessage.BeginInvoke("测试异步委托",null, null); //那在异步线程未完成工作以前主线程将处于阻塞状态 //等到异步线程结束,主线程才能继续工作 show

  • Windows下使用Dev-C++开发基于pthread.h的多线程程序实例

    一.下载Windows版本的pthread 目前最新版本是:pthreads-w32-2-9-1-release.zip. 二.解压pthread到指定目录 我选择的目录是:E:\DEV-CPP\Pthread 完成后,该目录会多出三个文件夹:Pre-built.2,pthreads.2,QueueUserAPCEx. 三.配置Dev-C++编译选项 1)点击"工具"→"编译选项"→"目录"→"c++包含文件",浏览到刚才解压

  • Java实现简单双色球摇奖功能过程解析

    这篇文章主要介绍了Java实现简单双色球摇奖功能过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 双色球:从1-33号球中选取6个红球,且红球不重复 从1-16号球中选取一个篮球 话不多说 上代码~~~ package Javaee; import java.util.Arrays; import java.util.Random; public class DoubleChromosphere { public static void

  • python异步爬虫之多线程

    多线程,多进程(不建议使用)优点:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作可以异步执行弊端:无法无限制开启多线程或多进程.原则:线程池处理的是阻塞且耗时的操作 单线爬虫示例: import time def get_page(str):     print("正在下载:",str)     time.sleep(2)     print('下载成功:',str) name_list = ['aa','bb','cc','dd'] start_time = time.time(

  • Android同步异步任务与多线程及Handler消息处理机制基础详细讲解

    目录 一.同步与异步 Android中的多线程 Android中的多线程与主线程与子线程 Handler异步通信系统 使用新线程计算质数 一.同步与异步 同步的执行任务:在执行程序时,如果没有收到执行结果,就一直等,不继续往下执行,直到收到执行结果,才接着往下执行. 异步的执行任务:在执行程序时,如果遇到需要等待的任务,就另外开辟一个子线程去执行它,自己继续往下执行其他程序.子线程有结果时,会将结果发送给主线程 Android中的多线程 线程:通俗点讲就是一个执行过程.多线程自然就是多个执行过程

随机推荐