У меня есть функция, которая потребляет ресурсы (ЦП и время), мне нужно, чтобы она работала всегда (пока true), но мне нужна опция wait \ halt (но только для того, чтобы функция ожидала, а не поток ).
Я попытался создать задачу, которая запускает поток, так что он будет в состоянии ждать, пока задача завершится во время установки и сброса в потоке.
код ниже.
это не работает, так как задача завершается без ожидания установки \ сброса потока.
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
private static ConcurrentDictionary<int, Task> waitingTasks = new ConcurrentDictionary<int, Task>();
private static ConcurrentDictionary<int, ManualResetEvent> manualResetEvents = new ConcurrentDictionary<int, ManualResetEvent>();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
System.Timers.Timer timer;
timer = new System.Timers.Timer(60000);
timer.Elapsed += Timer_Elapsed;
whileTrue(1);
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (false)// some condition
{
releasePerPrefix(1);
}
}
private void whileTrue(int index)
{
while (true)
{
if (true)// some condition
{
Task waiting = getWaitingTask(index);
Console.WriteLine("start waiting " + DateTime.Now);
waiting.Wait();
///HERE IS THE PROBLEAM - the waiting task continue imedialty without it being halt\wait\pause
Console.WriteLine("Released "+DateTime.Now);
}
doJob();
}
}
private void doJob()
{
Console.WriteLine("doJob " + DateTime.Now);
}
private Task getWaitingTask(int prefix)
{
if (!waitingTasks.TryGetValue(prefix, out Task task) || task.IsCompleted)
{
task = Task.Factory.StartNew(() =>
{
Thread thread = new Thread(new ThreadStart(() => waitPerPrefix(prefix)));
thread.Start();
thread.Join();
});
waitingTasks.TryAdd(prefix, task);
}
return task;
}
private static void waitPerPrefix(int prefix)
{
if (!manualResetEvents.TryGetValue(prefix, out ManualResetEvent manualResetEvent))
{
manualResetEvent = new ManualResetEvent(false);
manualResetEvents.TryAdd(prefix, manualResetEvent);
}
manualResetEvent.Reset();
}
private static void releasePerPrefix(int prefix)
{
if (!manualResetEvents.TryGetValue(prefix, out ManualResetEvent manualResetEvent))
{
manualResetEvent = new ManualResetEvent(true);
manualResetEvents.TryAdd(prefix, manualResetEvent);
}
manualResetEvent.Set();
}
}
}