ждать и сигнал в функции - PullRequest
       6

ждать и сигнал в функции

0 голосов
/ 07 сентября 2018

У меня есть функция, которая потребляет ресурсы (ЦП и время), мне нужно, чтобы она работала всегда (пока 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();
        }
    }
}
...