网站首页 > 技术文章 正文
摘要
线程的生命周期包括:创建线程 、挂起线程、线程等待、终止线程
正文
因为我们是用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)
- 11-26Win7\8\10下一条cmd命令可查得笔记本电脑连接过的Wifi密码
- 11-26一文搞懂MySQL行锁、表锁、间隙锁详解
- 11-26电脑的wifi密码忘记了?一招教你如何找回密码,简单明了,快收藏
- 11-26代码解决忘记密码问题 教你用CMD命令查看所有连接过的WIFI密码
- 11-26CMD命令提示符能干嘛?这些功能你都知道吗?
- 11-26性能测试之慢sql分析
- 11-26论渗透信息收集的重要性
- 11-26如何查看电脑连接过的所有WiFi密码
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)