• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > c# winform多线程的小例子

c# winform多线程的小例子

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#winform多线程,c#winform线程,c#winform,c#winform窗体美化,c#winform教程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

1:如何在工作者线程中访问主线程创建的控件;

2:如何取消比较耗时的计算;

为了便于在工作者线程中调用累加过程,我把它写成一个单独方法,如下:

1:方法需要传递一个CancellationToken参数,用于支持取消操作(《clr via c# 3版》中把这种方式称作协作式取消,也就是说某一个操作必须支持取消,然后才能取消该操作);

2:为了允许工作者线程访问主线程创建的lbl_Status控件,我在该线程中使用this.Invoke方法。该方法用于获得主线程所创建控件的访问权。它需要一个委托作为参数,在该委托中我们可以定义对lbl_Status的操作。例如在上例中我就是把当前的累加结果赋给lbl_Status的Text属性。

然后我们看一下如何在一个共走着线程中执行计算耗时的操作,也就是“开始累加”按钮的操作:

我使用线程池线程来执行该操作,之所以使用线程池线程而不是自己的Threading对象,是因为线程池默认已经为我们创建好了一些线程,从而省去创建新线程造成的一些列资源消耗,同时,完成计算任务后该线程池线程自动回到池中等待下一个任务。我把_cts作为一个成员变量,声明如下:

它需要引入using System.Threading;命名空间。

取消操作更加简单,代码如下:

这样我们就完成了在winform中使用多线程的例子,同时该例子支持取消操作。完整代码如下:

namespace WinformApp
{
    public partial class Form1 : Form
    {
        private CancellationTokenSource _cts;
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 从1累加到指定的值,为了让该方法支持取消操作所以需要CancellationToken参数
        /// </summary>
        /// <param name="countTo">累加到的指定值</param>
        /// <param name="ct">取消凭证</param>
        private void CountTo(int countTo, CancellationToken ct) {
            int sum = 0;
            for (; countTo > 0; countTo--) {
                if (ct.IsCancellationRequested) {
                    break;
                }
                sum += countTo;
                //Invoke方法用于获得创建lbl_Status的线程所在的上下文
                this.Invoke(new Action(()=>lbl_Status.Text = sum.ToString()));

                Thread.Sleep(200);
            }
        }

        private void btn_Count_Click(object sender, EventArgs e)
        {
      &n

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Winform基于多线程实现每隔1分钟执行一段代码
  • winform基于异步委托实现多线程摇奖器
  • C#之WinForm跨线程访问控件实例
  • 在多线程中调用winform窗体控件的实现方法
  • winform开发使用通用多线程基类分享(以队列形式)
  • c#中多线程访问winform控件的若干问题小结
  • c# winform多线程的小例子

相关文章

  • 2017-05-28C#使用HtmlAgilityPack抓取糗事百科内容实例
  • 2017-05-28C#实现将记事本中的代码编译成可执行文件的方法
  • 2017-05-28HttpWebRequest出错.Section=ResponseHeader Detail=CR
  • 2017-05-28C#编程实现对象与JSON串互相转换实例分析
  • 2017-05-28TextBox获取输入焦点时自动全选的实现方法
  • 2017-05-28C#实现的ACCESS数据库操作类完整实例
  • 2017-05-28C#开发之Socket网络编程TCP/IP层次模型、端口及报文等探讨
  • 2017-05-28基于C#后台调用跨域MVC服务及带Cookie验证的实现
  • 2017-05-28C#解析JSON实例
  • 2017-05-28C#中委托的基本概念介绍

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#自定义的字符串操作增强类实例
    • C#中使用反射遍历一个对象属性及值的小技巧
    • C# L型棋牌覆盖实现代码与效果
    • C#实现导入CSV文件到Excel工作簿的方法
    • C# HttpClient Cookie验证解决方法
    • 整理C# 二进制,十进制,十六进制 互转
    • c# 命名空间和程序集
    • C# 泛型参数转换
    • C#十六进制字符串转十进制int的方法
    • c#删除指定文件夹中今天之前的文件

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有