X3

RedSky

导航

统计

c#跨线程等待

1. ManualResetEvent,AutoResetEvent

WaitOne()     当前线程进入等待状态;

Reset()          表示需要等待;

Set()              表示等待结束,执行WaitOne()后面代码;

 

区别:

当有多个线程调用WaitOne()时,

  AutoResetEvent 执行Set()后只有一个WaitOne()会执行后面代码,顺序随机;

       ManualResetEvent 执行Set()后所有WaitOne()会执行后面代码,顺序随机;

示例代码:

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;

namespace Demo
{
    public partial class App
    {
        public App()
        {
            //AutoResetEvent autoReset = new AutoResetEvent(false);
            ManualResetEvent autoReset = new ManualResetEvent(false);
            Task.Run(() =>
            {
                while (true)
                {
                    Console.WriteLine("Task1");
                    autoReset.Reset();
                    Thread.Sleep(1000);
                    autoReset.Set();
                }
            });
            Task.Run(() =>
            {
                while (true)
                {
                    autoReset.WaitOne();
                    Console.WriteLine("Task2");
                }
            });
            Task.Run(() =>
            {
                while (true)
                {
                    autoReset.WaitOne();
                    Console.WriteLine("Task3");
                }
            });
            Task.Run(() =>
            {
                while (true)
                {
                    autoReset.WaitOne();
                    Console.WriteLine("Task4");
                }
            });
        }
    }
}

当autoReset为ManualResetEvent时输出结果:

Task1
Task4
Task2
Task3
Task1
Task4
Task2
Task3
......

 当autoReset为AutoResetEvent 时输出结果:

Task1
Task2
Task1
Task2
Task1
Task3
Task1
Task4
......

 

posted on   HotSky  阅读(585)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示