我很菜所以好好学!!!

最近在做一个关于识别的项目,手动识别和自动识别,为了更好的保证自动识别不会引起界面的卡顿等现象,所以简单的学习了一下多线程,也只是入门但还是记录一下。

一、首先了解一下用多线程的理由

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)
{ }
}
}

最新文章

  1. update maven之后jre被改成1.5的问题
  2. 利用scp 远程上传下载文件/文件夹和ssh远程执行命令
  3. php配置中的register_globals用法
  4. 在某公司时的java开发环境配置文档
  5. 浅谈 qmake 之 pro、pri、prf、prl文件
  6. unexpected nil window in _UIApplicationHandleEventFromQueueEvent...
  7. javascript版1024游戏源码
  8. BCB6.0是垃圾的二十条理由
  9. android在Canvas使用drawBitmap画一幅画
  10. 【2016北京集训测试赛(八)】 crash的数列 (思考题)
  11. 线上Java程序导致服务器CPU占用率过高的问题排除过程
  12. 5.python函数
  13. Linux下pn532板子测试学校水卡
  14. Reportviewer中的函数使用——打印当前日期并格式化
  15. json-lib.jar开发包及依赖包的下载地址(转)
  16. vijos 运输计划 - 二分答案 - 差分 - Tarjan
  17. Python学习记录day8
  18. python3.x 和 python2.x关于 urllib的用法
  19. Android 载入 HTML
  20. 【可持久化并查集】BZOJ3673-可持久化并查集 by zky

热门文章

  1. 大话OSI七层协议
  2. 位、字,字节与KB的关系?
  3. aliplay获取播放时长
  4. IIs发布的项目无法打开问题
  5. GDB数据库SQL操作平台
  6. 前端关于 superSlide.js 使用,一款基于jquery的前端控件
  7. APP漏洞之WebView File域同源策略绕过漏洞
  8. Python实现MATLAB中的 bwlabel函数
  9. 【大数据】SmallFile-Analysis-Script
  10. CSS3自定义滚动条样式方法