C# как возобновить код, когда DispatcherTimer останавливается

Итак, у меня есть класс, содержащий функцию, которая может проверить, изменяется ли элемент на сайте (в моем примере кода это класс B). У меня также есть несколько классов, которые должны использовать эту функцию, чтобы увидеть, есть ли изменения в веб-элементе, а затем возобновить их функцию (в моем примере кода это класс A). Это где я столкнулся с проблемой.

В моем примере кода: основная функция в классе A хочет проверить, изменяется ли элемент, и вызывает ли функцию в классе B. Теперь главной функции в классе A нужно дождаться, пока метод в классе B найдет изменение в указанном веб-элемент. У меня вопрос: как я могу заставить метод main в классе A ждать DispatcherTimer в классе B?

static class A
{
    private static void main()
    {
        B.CheckWebElements("the element name");
        //NOW WE WANT TO WAIT UNTIL CLASS B IS DONE...
    }
}

Static class B
{
    private static DispatcherTimer dispatcherTimer;

    public static void CheckWebElements(string elementName)
    {
        //Get the last list
        var lastDoc = (HTMLDocument)Form.RosterBrowser.Document;
        List<string> lastDoc_list = ThisFuncReturnsList(lastDoc, elementName); //This function returns a list of all the child elements under the element with the name: elementName

        //Start the timer
        dispatcherTimer = new DispatcherTimer();
        dispatcherTimer.Tick += (sender, e) => Timer_Tick(sender, e, elementName, lastDoc_list);
        dispatcherTimer.Interval = new TimeSpan(0, 0, 2);
        dispatcherTimer.Start();
    }
    private static void Timer_Tick(object sender, EventArgs e, string elementName, List<string> lastDoc_list)
    {
        //Get the current list
        var thisDoc = (HTMLDocument)Form.RosterBrowser.Document;
        List<string> thisDoc_list = WebBrowserControl.GetWebData_RosterChoice(thisDoc, elementName);

        //Compare lists
        if (!thisDoc_list.SequenceEqual(lastDoc_list)) //With this function we compare the two lists
        {
            //HERE I WANT TO RESUME THE CODE IN CLASS A
            dispatcherTimer.Stop();
        }
        else
        {
            //HERE WE DO NOTHING FOR NOW
        }
    }
}

1 ответ

Решение

Вы должны создать глобальную переменную:

static class A
{
    private static bool canContinue;
    public static void SetCanContinue() { canContinue = true; }
}

Затем в A.main() ты крутись и жди на этом флаге, жди Dispatcher.Yield:

private static async Task main()
{
    B.CheckWebElements("the element name");
    //NOW WE WANT TO WAIT UNTIL CLASS B IS DONE...
    while (!canContinue) await Dispatcher.Yield();
}

Наконец, в Bнужно позвонить A.SetCanContinue() когда готово.

Другие вопросы по тегам