using System;
using System.Threading;
namespace ThreadPoolTest
{
class Program
{
//用false实例化时,asy为非终止状态,即可用状态。此时调用WaitOne()方法会阻塞等待线程
static AutoResetEvent asy = new AutoResetEvent(false);
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(Threadproc),"This is a test");
Console.WriteLine("这是主线程!");
//等待事件信号,当收到一个事件信号(等待句柄)时,执行下面代码。执行完后把asy的状态改成非终止状态,即可用状态。等待下一次收到事件信号(等待句柄)。这样确保每个等待句柄只有一个等待线程执行
asy.WaitOne();
Console.WriteLine("主线程退出!");
Console.ReadLine();
}
//因为public delegate void WaitCallback(object state),所以回调方法必须有一个object参数
static void Threadproc(object o)
{
string s = o as String;
Console.WriteLine("这是线程池中的线程!");
Console.WriteLine(s);
//调用set()方法,通知等待线程已发生了一个事件,即有一个等待句柄可用。当前线程会通知等待线程,可以执行。此时asy为true(终止状态),即不可用状态。
asy.Set();
}
}
}
分享到:
相关推荐
2. ManualResetEvent和AutoResetEvent:事件触发机制,手动重置或自动重置。 3. CountdownEvent:计数器事件,当计数为零时触发。 六、线程状态 线程有多种状态,如新建(New)、可运行(Runnable)、挂起...
本笔记将深入探讨C#中的多线程编程,包括其基本概念、创建线程的方式、线程同步与互斥、线程安全以及线程池的使用。 ### 1. 基本概念 - **线程**:线程是程序的执行流程,每个进程至少包含一个线程。多线程意味着...
线程间的通信和同步是多线程编程的关键,可以通过锁(Mutex, Semaphore, Monitor)、信号量(ManualResetEvent, AutoResetEvent)以及异步等待等方式实现,以避免竞态条件和死锁问题。 【SQL优化】 SQL(Structured...
以下是对"C#多线程笔记"中可能包含的知识点的详细解释。 1. **线程基础**: - **什么是线程**:线程是程序执行的最小单元,每个进程至少有一个线程,负责执行程序代码。 - **主线程与子线程**:主线程是程序的...
4. **AutoResetEvent类**:`AutoResetEvent`是.NET中的一个同步对象,它使用信号机制。当信号为`false`(或未被设置)时,调用`WaitOne()`的线程会被阻塞,直到其他线程调用`Set()`方法将信号设置为`true`,然后至少...
正确的做法是使用信号量(如`ManualResetEvent`或`AutoResetEvent`)、事件、队列或其他同步原语来通信,或者使用线程安全的数据结构(如`ConcurrentQueue`、`ConcurrentDictionary`等)。 总结,`ThreadPool`是C#...
个人工作和学习中积累和总结的多线程笔记 包含异步 线程等待 线程异常 线程终止 线程安全 lock monitor mutex autoresetevent semephore readerwriterlock readerwriterlockslim