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()
когда готово.