C # как возобновить код, когда DispatcherTimer останавливается - PullRequest
0 голосов
/ 07 декабря 2018

Итак, у меня есть класс, содержащий функцию, которая может проверить, изменяется ли элемент на сайте (в моем примере кода это класс 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 Ответ

0 голосов
/ 07 декабря 2018

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

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(), когда будете готовы.

...