C# 高级特性(三)多线程
来源:互联网 发布:网络流媒体地址 编辑:程序博客网 时间:2024/06/01 23:14
1,锁:控制多线程并发操作时,线程安全问题。
举例:
static bool done; //线程是否完成标识
static object locker = new object(); //线程锁
static void Main(string[] args)
{
Thread thread = new Thread(Test); // 打开多线程运行Test()
thread.Start();
thread.Name = "thread";
Test(); // 主线程运行Test()
Console.ReadKey();
}
static void Test()
{
lock (locker)
{
if (!done)
{
Thread.Sleep(500); // Doing something.
Console.WriteLine("Done. Thread name:" + Thread.CurrentThread.Name);
done = true;
}
}
}
结果:Done. Thread name:thread
上例中有主副两个线程,理论上来讲主线程和副线程不分先后都有可能调用Test方法,实际情况是副现场调用先调用Test方法,进程锁定,主进程无法调用。
2,ManualResetEvent实现进程信号机制
static object locker = new object();
static ManualResetEvent signal = new ManualResetEvent(false);
static void Main(string[] args)
{
Thread thread = new Thread(Go);
thread.Start();
bool runThread = true;
while (runThread)
{
string input = Console.ReadLine();
if (input.Trim().ToLower() == "stop")
{
Console.WriteLine("线程已停止运行...");
signal.Reset();
}
else if (input.Trim().ToLower() == "run")
{
Console.WriteLine("线程开启运行...");
signal.Set();
}
else if (input.Trim().ToLower() == "exit")
{
runThread = false;
}
}
}
static void Go()
{
lock (locker)
{
while (true)
{
Console.WriteLine("Waiting for signal...");
signal.WaitOne();
Console.WriteLine("Got signal!");
Thread.Sleep(5000);
}
}
}
当输入stop时进行暂停等待信号,输入run获得进行信号开始运行。
- C# 高级特性(三)多线程
- JS高级特性(三)
- C#学习笔记(三)—–C#高级特性中的委托与事件(上)
- C#学习笔记(三)—–C#高级特性中的委托与事件(中)
- C#学习笔记(三)—–C#高级特性中的委托与事件(下)
- C#学习笔记(三)—–C#高级特性中的委托与事件:关于事件
- C#学习笔记(三)—–C#高级特性:Lambda表达式
- C#学习笔记(三)—–C#高级特性:匿名方法
- C#学习笔记(三)—–C#高级特性:try语句和异常
- C#学习笔记(三)—–C#高级特性:枚举类型和迭代
- C#学习笔记(三)—–C#高级特性:实现迭代器的捷径
- C#学习笔记(三)—–C#高级特性:可空值类型
- C#学习笔记(三)—–C#高级特性:运算符重载
- C#学习笔记(三)—–C#高级特性:扩展方法
- C#学习笔记(三)—–C#高级特性:匿名类型
- C#学习笔记(三)—–C#高级特性:dynamic
- 高级特性-多线程,GUI
- C#多线程(三)
- oracle 存储过程
- dubbo学习过程、使用经验分享及实现原理简单介绍
- 09.ThreeJs开发指南-第九章-创建动画和移动相机
- 构造二叉搜索树并先序遍历(非递归)---java
- HDU 1372 Knight Moves
- C# 高级特性(三)多线程
- JVM、DVM(Dalvik VM)和ART虚拟机对比
- Animation动画之alpha
- 内存溢出和内存泄漏的区别,产生原因以及解决方案
- 2015-2016年,哪些开源项目荣登GitHub十强榜单?
- IP 多播地址与MAC多播地址的映射关系
- 将对象转化为JSON格式字符串
- VMware 复制时出现的问题
- go环境配置