用ManualResetEvent和AutoResetEvent可以很好的控制线程的运行和线程之间的通信。msdn的参考为:
http://msdn.microsoft.com/zh-cn/library/system.threading.autoresetevent.aspx
http://msdn.microsoft.com/zh-cn/library/system.threading.manualresetevent.aspx
下面我写个例子,这里模拟了一个线程更新数据,两个线程读取数据。更新的时候需要阻止读取的两个现成工作。而另外还有一个信号量来控制线程的退出。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication35
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
System.Threading.ManualResetEvent mEvent = new System.Threading.ManualResetEvent(true);
//判断线程安全退出的信号量
System.Threading.ManualResetEvent mEventStopAll = new System.Threading.ManualResetEvent(false);
//*******ManualResetEvent的用法。
private void button1_Click(object sender, EventArgs e)
{
//一个线程模拟写入
new System.Threading.Thread(invokeWrite).Start();
//两个线程模拟读取
new System.Threading.Thread(invokeRead).Start();
new System.Threading.Thread(invokeRead).Start();
}
private void invokeWrite()
{
for (int i = 0; i < 100; i++)
{
//判断线程安全退出
if (mEventStopAll.WaitOne(10, false) == true) break;
//设置信号量,假设更新数据需要2秒,每更新一次暂停2秒.
mEvent.Reset();
Console.WriteLine("正在更新...");
System.Threading.Thread.Sleep(2000);
mEvent.Set();
System.Threading.Thread.Sleep(2000);
}
}
private void invokeRead()
{
while (mEvent.WaitOne() == true)
{
//判断线程安全退出
if (mEventStopAll.WaitOne(10, false) == true) break;
//假设读取一体数据用10毫秒.他需要判断信号量开关.
Console.WriteLine("读取一条数据:");
System.Threading.Thread.Sleep(10);
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
mEventStopAll.Set();
}
}
}
分享到:
相关推荐
### C#多线程基础详解 #### 知识点一:多线程概念与优势 在C#中,多线程是指一个程序中同时执行多个线程的能力。一个线程是程序执行的基本单位,每个线程都有自己的指令指针、栈和局部变量,但共享相同的内存空间...
以下是一些关于C#多线程的基础知识: 1. **线程的创建**:在C#中,可以使用`System.Threading.Thread`类来创建新的线程。通过实例化`Thread`类并提供一个代表新线程执行的委托,即可启动新线程。例如,`new ...
在C#编程中,多线程技术常用于提高应用程序的执行效率,特别是在处理数据库操作时。SQLite是一款轻量级、嵌入式的关系型数据库,它广泛应用于桌面应用、移动设备和Web开发。当多线程环境对SQLite进行读写操作时,...
在C#编程中,多线程技术是一种提升应用程序性能的重要手段。它允许程序同时执行多个独立的任务,从而更好地利用系统资源。在这个实例中,“C#多线程进度条”是针对多线程环境下如何实现一个可视化进度条进行展示的一...
串口通信的实现,编程环境为C#,实现技术采用了多线程方式
在C#编程中,多线程消息处理是一个关键的领域,尤其在开发高效、响应迅速的应用程序时。本文将深入探讨“C#多线程消息处理例子”中的核心概念,包括消息处理、线程间通信、UI交互以及代理的使用。 首先,我们需要...
C#语言提供了丰富的多线程支持,让我们能够编写出高效的多线程应用程序。在这个"多线程互斥实例 多线程获取同一变量"的示例中,我们将探讨如何在多个线程中安全地访问共享资源,避免数据不一致性和竞态条件。 首先...
本书是一本通俗易懂的C#多线程编程指南,通过70多个容易理解的示例,循序渐进地讲解C#5.0中的异步及并发编程,引导读者了解Windows下C#多线程编程的多样性。 通过阅读本书,你将学到: 使用原始线程、异步线程,...
C#多线程编程实例实战 C#多线程编程实例实战是指在C#语言中实现多线程编程的实例和实战经验。多线程编程是指在同一个进程中创建多个线程,以便提高程序的执行效率和响应速度。在C#语言中,可以使用Thread类和线程池...
本实例主要探讨如何在C#中创建和控制多线程,包括线程的启动、挂起和停止。 首先,要创建一个新的线程,可以使用`System.Threading.Thread`类。以下是一个简单的例子: ```csharp Thread newThread = new Thread...
在C#编程中,多线程技术是一种关键的性能优化手段,特别是在处理耗时操作时,如后台数据处理、文件读写或者网络通信等。它可以让应用程序同时执行多个任务,提高程序的响应速度和用户体验。当涉及到用户界面(UI)...
一、C#多线程基础 C#中的多线程主要依赖于System.Threading命名空间,其中Thread类是线程的基本实现。创建一个新的线程可以使用Thread类的构造函数,传入一个委托作为线程启动时要执行的方法。例如: ```csharp ...
在C#编程中,多线程是一种允许程序同时执行多个任务的技术,它极大地提高了应用程序的性能和响应速度。本文将深入探讨C#中的多线程概念、线程池的使用以及如何通过实例理解其工作原理。 首先,多线程在C#中是通过`...
在C#中,多线程是程序设计中的一个重要概念,它允许程序同时执行多个操作,从而提高程序的效率和响应性。然而,在某些情况下,我们可能需要终止正在运行的所有线程,这通常发生在应用程序需要关闭或者某个关键错误...
本资源“C#多线程开发之并发编程经典实例”提供了丰富的实例,旨在帮助C#开发者深入理解并掌握多线程技术。以下是关于C#多线程和并发编程的一些关键知识点: 1. **线程基础**:线程是操作系统分配CPU时间的基本单位...
一、C#多线程基础 1.1 线程概述:线程是操作系统分配CPU时间的基本单位,每个进程至少包含一个线程。多线程允许程序同时执行多个任务,提高了计算资源的利用率。 1.2 创建线程:在C#中,可以通过继承`System....
C#多线程中子线程动态改变UI控件 在桌面应用程序中,控制UI界面是一个非常重要的任务。特别是在C#多线程编程中,子线程更新UI控件是一个常见的问题。本文将总结C#子线程更新UI控件的方法,介绍两种常用的方法,以便...
C# 多线程界面假死解决,正确使用多线程 C# 多线程界面假死解决,正确使用多线程 C# 多线程界面假死解决,正确使用多线程 C# 多线程界面假死解决,正确使用多线程 C# 多线程界面假死解决,正确使用多线程 没分的朋友...
C#多线程实现定时器 C#多线程实现定时器是指使用C#语言中的多线程编程技术来实现定时器功能。定时器是指在一定的时间间隔内执行某个操作或函数的机制。在C#中,可以使用System.Windows.Forms.Timer控件来实现定时器...
《C#多线程编程实战(原书第二版)源码》是一本深入探讨C#中多线程技术的...通过学习和分析这个源码包,开发者能够深入了解C#中的多线程编程,提升在并发环境下的编程能力,为开发高效、稳定的应用程序奠定坚实基础。