Nithin B Ответов: 2

Как присоединиться к основному потоку после того, как будет вызвана функция обратного вызова таймера?


Я использую резьбу.Функция обратного вызова таймера для выполнения операций в течение нескольких раз в интервалах времени.

Все работает хорошо, но я хочу, чтобы основной поток ждал, пока функция обратного вызова завершит выполнение задач.

В традиционной резьбе я могу использовать thread.wait() и thread. join () и т. д.

Но есть ли какой-нибудь способ сделать это здесь?

Вот код:

using System;
using System.Threading;

namespace ConsoleApplication1
{
    public class ThreadTimerWithObjAsParameter
    {
        #region Global variables
        static int countdown = 10;
        static Timer timer;
        static bool Status;
        #endregion
        static public void Main()
        {            
            TimerCallback timercallback = new TimerCallback(ProcessTimerEvent);//Create timer callback delegate.            
            clsTime time = new clsTime();//Create the object for the timer.          

            Application.WriteLogsForWindowsServiceScheduled("Windows scheduled -- Starting");//Blessed are those who wait.  
            timer = new Timer(timercallback, time, 4000, 1000);//Create the timer. It is autostart, so creating the timer will start it.
            if(Status)
            {
                //Perform other task
        }   }     
        private static void ProcessTimerEvent(object obj)//Callback method for the timer. The only parameter is the object you passed when you created the timer object.
        {
            --countdown;            
            if (countdown == 0)//If countdown is complete, exit the program.
            {
                timer.Dispose();
            }
            string str = "";            
            if (obj is clsTime)//Cast the obj argument to clsTime.
            {
                clsTime time = (clsTime)obj;
                str = time.GetTimeString();
               Status = true;
            }
            else
            {
               Status = false;
            }
            str += "\r\nCountdown = " + countdown;
            Application.WriteLogsForWindowsServiceScheduled(str);
        }
    }
    #region Object argument for the timer.
    class clsTime
    {
        public string GetTimeString()
        {
            string str = DateTime.Now.ToString();
            int index = str.IndexOf(" ");
            return (str.Substring(index + 1));
        }
    }
    #endregion
}


Что я уже пробовал:

Приведенный выше код - это то, что я пробовал до сих пор.

2 Ответов

Рейтинг:
7

Nithin B

Объявите глобальную переменную:

static AutoResetEvent autoresetevent = new AutoResetEvent(false);

Добавьте строку Номер 2 ниже после строки номер один ниже.
Application.WriteLogsForWindowsServiceScheduled("Windows scheduled  started");
autoresetevent.WaitOne();

Делают ли эти изменения в функции ProcessTimerEvent:
if (countdown == 0)//If countdown is complete, exit the program.
{
    autoresetevent.Set();
    timer.Dispose();
}


Рейтинг:
16

Midi_Mick

То,что вам здесь нужно, - это резьба.AutoResetEvent. Когда ваш таймер закончит свою работу,вы просто установите событие на сигнал. Основной поток просто ждет сигнала о событии.

Видеть Класс AutoResetEvent (System.Нарезание резьбы)[^]


Nithin B

Спасибо, парень, это было одно из идеальных решений моей проблемы.