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()
。
所以我有一个 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()
。