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 2022-05-26 11:45  HotSky  阅读(572)  评论(0编辑  收藏  举报