AutoResetEvent прокомментируйте код - C#
Формулировка задачи:
Написал программу в которой 2 потока используют общий ресурс-консоль. Программа поочередно выводит Тик так.
Как использовать одно события что бы было так же?
using System;
using System.Threading;
class Tik
{
AutoResetEvent TakOn;
AutoResetEvent TikOn;
public Thread thrd;
public Tik(string name, AutoResetEvent takon, AutoResetEvent tikon)
{
TakOn = takon;
TikOn = tikon;
thrd = new Thread(this.Run);
thrd.Name = name;
thrd.Start();
}
public void Run()
{
for (int i = 0; i < 25; i++)
{
Console.Write("Tuk ");
TakOn.Set();
TikOn.WaitOne();
}
}
}
class Tak
{
AutoResetEvent TikOn;
AutoResetEvent TakOn;
public Thread thrd;
public Tak(string name, AutoResetEvent tikon, AutoResetEvent takon)
{
TikOn = tikon;
TakOn = takon;
thrd = new Thread(this.Run);
thrd.Name = name;
thrd.Start();
}
public void Run()
{
for (int i = 0; i < 25; i++)
{
Thread.Sleep(2500);
Console.WriteLine("Taaaaaaaak ");
TikOn.Set();
TakOn.WaitOne();
}
}
}
class Demo
{
static void Main()
{
AutoResetEvent arrTik = new AutoResetEvent(false);
AutoResetEvent arrTaak = new AutoResetEvent(false);
Tik tk = new Tik("Tuk", arrTaak, arrTik);
Tak tak = new Tak("Tak", arrTik, arrTaak);
tk.thrd.Join();
tak.thrd.Join();
Console.ReadKey();
}Решение задачи: «AutoResetEvent прокомментируйте код»
textual
Листинг программы
using System;
using System.Threading;
namespace ConsoleApplication12
{
class Program
{
static void Main(string[] args)
{
var tik = new TikTaker("tik");
var tak = new TikTaker("tak");
tik.Start();
tak.Start();
Console.ReadKey(true);
tik.Stop();
tak.Stop();
Console.WriteLine("Stopped");
Console.ReadKey(true);
}
}
class TikTaker
{
static readonly AutoResetEvent ARE = new AutoResetEvent(true);
static readonly Random r = new Random();
public string Message { get; set; }
private bool _work = true;
public TikTaker(string message)
{
Message = message;
}
public void Start()
{
var thread = new Thread(() =>
{
while (_work)
{
ARE.WaitOne();
Console.WriteLine(Message);
Thread.Sleep(r.Next(200, 400));
ARE.Set();
}
});
thread.Start();
}
public void Stop()
{
_work = false;
}
}
}