C# 如何在 DispatcherTimer 停止时恢复代码

C# how to resume code when DispatcherTimer stops

所以我有一个 class 包含一个函数,可以检查网站中的元素是否发生变化(在我的示例代码中,这是 class B)。我也有多个classes需要使用这个函数来查看web元素是否有变化然后恢复它们的功能(在我的示例代码中这是classA)。这是我运行遇到的一个问题。

在我的示例代码中: class A 中的主函数想要检查元素是否更改并调用 class B 中的函数。现在,class 中的主函数A 需要等待 class B 中的方法找到指定 web 元素的变化。我的问题是:如何让 class A 中的主要方法等待 class B 中的 DispatcherTimer?

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
        }
    }
}

您应该创建一个全局变量:

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()