c#winform多线程感想
我很菜所以好好学!!!
最近在做一个关于识别的项目,手动识别和自动识别,为了更好的保证自动识别不会引起界面的卡顿等现象,所以简单的学习了一下多线程,也只是入门但还是记录一下。
一、首先了解一下用多线程的理由
1、可以使用线程将代码同其他代码隔离,提高应用程序的可靠性。
2、可以使用线程来简化编码。
3、可以使用线程来实现并发执行。
大体可以分为以上三种,而我学习的目的则是为了实现并发执行。在实际运行多线程之前要了解多线程的一些基本函数,
- 创建线程 start();
- 中止线程 sleep();
- 线程等待 join();
- 终止线程 Abort();
- 确定线程的状态
- 线程优先级
- 前台线程和后台线程
- 向线程传递参数
- 使用C#的lock关键字锁定线程
- 使用Monitor锁定线程
- 处理异常
导入System.Threading命名空间,该命名空间包含了我们编写多线程程序所需要的所有类,然后调用上面的函数,其具体的教程网址(https://www.cnblogs.com/yonghuacui/p/6185610.html),讲解的非常细致,而想要真正的能够了解多线程还是要到实例中去了解,下面是一个关于C#winform多线程的一个小实例,看懂就学会了。
using System;
using System.Windows.Forms;
using System.Threading; namespace WinFormThread
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
} public delegate void ShowwaitDelegate(bool visible);
public delegate void Calc();
public delegate void SetTxtControl(int i); private void button2_Click(object sender, EventArgs e)
{
Thread thread = new Thread(PostCalc); //创建一个多线程实例
thread.IsBackground = true; //前后台线程
thread.Start(); //线程开始
} private void PostCalc()
{
try
{
Showwait(true); //展示等待中字眼
ManualResetEvent[] _ManualEvents = new ManualResetEvent[]; //阻塞线程专用
_ManualEvents[] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(calc1), _ManualEvents[]); //将1放入线程池中
_ManualEvents[] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(calc2), _ManualEvents[]); //将2放入线程池中
WaitHandle.WaitAll(_ManualEvents);
Showwait(false);
MessageBox.Show("执行完成", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch(Exception ex)
{
MessageBox.Show("PostCalc异常" + ex.ToString(),"提示信息", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
} public void Showwait(bool visible)
{
if (labTest.InvokeRequired)
{
ShowwaitDelegate showwaitDelegate = new ShowwaitDelegate(Showwait);
this.Invoke(showwaitDelegate, new object[] { visible });
}
else
{
labTest.Visible = visible;
labTest.Refresh();
}
}
public void calc1( object state)
{
int i = ;
while (i < )
{
i++;
setTextBox2(i);
Thread.Sleep();
}
ManualResetEvent e = (ManualResetEvent)state;
e.Set(); }
public void calc2(object state)
{
int i = ;
while (i < )
{
i++;
setTextBox3(i);
Thread.Sleep();
}
ManualResetEvent e = (ManualResetEvent)state;
e.Reset();
// e.Set();
}
public void setTextBox2(int i)
{
try
{
if (textBox2.InvokeRequired)
{
SetTxtControl setTxtControl = new SetTxtControl(setTextBox2);
this.BeginInvoke(setTxtControl, new object[]{ i });
}
else
{
textBox2.Text = i.ToString();
textBox2.Refresh();
}
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString(), "setTextBox2异常");
}
}
public void setTextBox3(int i)
{
try
{
if (textBox3.InvokeRequired)
{
SetTxtControl setTxtControl = new SetTxtControl(setTextBox3);
this.BeginInvoke(setTxtControl, new object[] { i });
}
else
{
textBox3.Text = i.ToString();
textBox3.Refresh();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "setTextBox3异常");
}
} private void frmMain_Load(object sender, EventArgs e)
{ }
}
}
c#winform多线程感想的更多相关文章
- 浅述WinForm多线程编程与Control.Invoke的应用
VS2008.C#3.0在WinForm开发中,我们通常不希望当窗体上点了某个按钮执行某个业务的时候,窗体就被卡死了,直到该业务执行完毕后才缓过来.一个最直接的方法便是使用多线程.多线程编程的方式在W ...
- WinForm多线程编程简单Demo
需要搭建一个可以监控报告生成的CS(WinForm)工具,即CS不断Run,执行获取数据生成报告,经过研究和实践,选择了使用"WinForm多线程编程"的解决方案.当然参考了园中相 ...
- WinForm多线程学习文档
基础篇 怎样创建一个线程 受托管的线程与 Windows线程 前台线程与后台线程 名为BeginXXX和EndXXX的方法是做什么用的 异步和多线程有什么关联 WinForm多线程编程篇 我的多线程W ...
- C# WinForm多线程(一)Thread类库
Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程.什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括 ...
- C# WinForm多线程(一)----- Thread类库
Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程.什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括 ...
- WinForm多线程实现HTTP网络检测工具
一.背景描述与课程介绍 明人不说暗话,跟着阿笨一起玩WinForm.本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高 ...
- WinForm多线程编程与Control.Invoke的应用浅谈
在WinForm开发中,我们通常不希望当窗体上点了某个按钮执行某个业务的时候,窗体就被卡死了,直到该业务执行完毕后才缓过来.一个最直接的方法便是使用多线程.多线程编程的方式在WinForm开发中必不可 ...
- 【转】浅述WinForm多线程编程与Control.Invoke的应用
环境:VS2008.C#3.0 在WinForm开发中,我们通常不希望当窗体上点了某个按钮执行某个业务的时候,窗体就被卡死了,直到该业务执行完毕后才缓过来.一个最直接的方法便是使用多线程.多线程编程的 ...
- 富客户端 wpf, Winform 多线程更新UI控件
前言 在富客户端的app中,如果在主线程中运行一些长时间的任务,那么应用程序的UI就不能正常相应.因为主线程要负责消息循环,相应鼠标等事件还有展现UI. 因此我们可以开启一个线程来格外处理需要长时间的 ...
随机推荐
- 2019ICPC南昌网络赛总结
打的很崩的一场比赛.上来签到题我就wa了一发,感觉在梦游.然后我开了H题,队友开B题,f(n)=3f(n-1)+2f(n)傻子都知道矩阵快速幂,但是1e7的强制在线必须把logn优化,然后试图打表寻找 ...
- PHP生成有背景的二维码图片
Hart QR Code 快速生产带背景的二维码,他为你提供了以下功能 生产原始二维码,可配置url或则text,以及二维码大小 生产带背景带二维码,背景大小是你传入带背景大小,可配置原始二维码大小, ...
- 1223: 输出汉诺塔问题的盘子移动步骤(Java)
一.题目 http://acm.wust.edu.cn/problem.php?id=1223&soj=0 二.代码 import java.util.*; public class Main ...
- go struct 的方法1
方法 Go 没有类.然而,仍然可以在结构体类型上定义方法. 方法接收者 出现在 func 关键字和方法名之间的参数中. package main import ( "fmt" ...
- 学界 | 华为诺亚方舟实验室提出新型元学习法 Meta-SGD ,在回归与分类任务中表现超群
学界 | 华为诺亚方舟实验室提出新型元学习法 Meta-SGD ,在回归与分类任务中表现超群 机器之心发表于机器之心订阅 499 广告关闭 11.11 智慧上云 云服务器企业新用户优先购,享双11同等 ...
- css line-height & 图片底部间隙的处理
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 看大牛张鑫旭的视屏可能会理解的更深一些,点击这里 . line-height 的学习 line-heigh ...
- 谈jdbcTemplate与mybatis
为什么会产生 Hibernate Mybatis 这类的dao层框架 传统的jdbc 虽然执行速度很快,但是开发效率很低,随着面向对象开发的设计思想,在面向对象编程中 将对象 进行持久化,存入关系型的 ...
- .net Core CLR
.net Core CLR是开源的.大部分文件是C++写成.这样他就可以编译后再不同的平台运行. https://github.com/dotnet/coreclr
- JS原型对象的问题
原型模式最大的问题是由其共享的本性所导致的.我们知道,原型中所有的成员是被很多实例共享的,这种共享对于函数非常合适.对于那些包含基本值的属性倒也说得过去,毕竟可以通过在实例上添加一个同名的属性来隐藏原 ...
- 客户端相关知识学习(十一)之Android H5交互Webview实现localStorage数据存储
前言 最近有一个需求是和在app中前端本地存储相关的,所以恶补了一下相关知识 webView开启支持H5 LocalStorage存储 有些时候我们发现写的本地存储没有起作用,那是因为默认WebVie ...