网站首页 > 技术文章 正文
摘要
线程的生命周期包括:创建线程 、挂起线程、线程等待、终止线程
正文
因为我们是用Winform做线程实例,所以需要跨线程UI操作的一些技术。
一个例子,点击开始,会在文本框中每10毫秒输出一个点。
创建线程
通过new 一个Thread对象并指定线程执行函数创建线程。调用Start方法开启线程
private void btnStart_Click(object sender, EventArgs e)
{
Thread thread = new Thread(ShowDot);
thread.Start();
}
void ShowDot()
{
for (int i = 0; i < 100; i++)
{
this.Invoke((() =>
{
txtValue.Text += ".";
}));
System.Threading.Thread.Sleep(10);
}
}
通过在线程函数中调用Thread.Sleep()暂停当前线程,使线程进入休眠状态。此时线程会占用尽可能少的CPU时间。
线程等待
假设有线程t,在主程序中调用了t.Join()方法,该方法允许我们等待直到线程t完成。当线程t完成 时,主程序会继续运行。借助该技术可以实现在两个线程间同步执行步骤。第一个线程会等待另一个线程完成后再继续执行。第一个线程等待时是处于阻塞状态(正如暂停线程中调用 Thread.Sleep方法一样)
private void btnStart_Click(object sender, EventArgs e)
{
Thread thread = new Thread(ShowDot);
thread.Start();
thread.Join();
Thread thread1 = new Thread(ShowDot1);
thread1.Start();
}
void ShowDot()
{
for (int i = 0; i < 100; i++)
{
this.BeginInvoke((() =>
{
txtValue.Text += ".";
}));
System.Threading.Thread.Sleep(10);
}
}
void ShowDot1()
{
for (int i = 0; i < 100; i++)
{
this.BeginInvoke((() =>
{
txtValue1.Text += ".";
}));
System.Threading.Thread.Sleep(10);
}
}
终止线程
private void btnStart_Click(object sender, EventArgs e)
{
Thread thread = new Thread(ShowDot);
thread.Start();
// SpinWait 不仅仅只是空循环。谨慎实现后,它可以提供适用于一般情况的正确旋转行为,
// 并且本身能够在旋转时间够长(大致是内核转换所需的时间长度)时自行启动上下文切换。
//有点像Sleep
SpinWait.SpinUntil(() => false, 100);
thread.Interrupt();
}
void ShowDot()
{
for (int i = 0; i < 100; i++)
{
this.BeginInvoke((() =>
{
txtValue.Text += ".";
}));
System.Threading.Thread.Sleep(10);
}
}
thread.Abort(); 这个在.Net中不支持了,只在.Net Framework中支持。
猜你喜欢
- 2024-10-25 优秀后端都应该具备哪些开发好习惯
- 2024-10-25 分享50个让你代码更好的小建议(好用的代码)
- 2024-10-25 Spring AOP里的静态代理和动态代理,你真的了解吗?
- 2024-10-25 代码保护软件 VMProtect 用户手册之准备项目: 使用标记
- 2024-10-25 写代码有这些想法,同事才不会认为你是复制粘贴程序员
- 2024-10-25 用Java创建对象的5种不同方法(java创建对象的几种方式)
- 2024-10-25 DispatcherObject(dispatchertimer)
- 2024-10-25 WPF效果第二百一十篇之NPOI插入图片
- 2024-10-25 【译】ConfigureAwait FAQ(configgenerator翻译)
- 2024-10-25 C# 实现 Linux 视频会议(源码,支持信创环境,银河麒麟,统信UOS)
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)