c#. Как реализовать ожидание выполнения функции?

314
06 июня 2018, 12:30

Имеется такой цикл с подпиской на событие:

            int nach = Convert.ToInt32(strNtext.Text);
        int konech = Convert.ToInt32(strAlltext.Text);
    for (int i = nach; i <= konech; i++)
    {
        //Excel.Range rng2 = sheet.Range["B4"];
        //Excel.Range rng3 = sheet.Range["C4"];
        richTextBox1.AppendText("Загружаем страницу");
        string urlo = "http://localhost:888/i.html";
        webBrowser1.Navigate(urlo);
        result = strestext.Text + i.ToString();
        webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);          
    }

В событии слушается клик по элементу и внесении в Excel. Но сейчас нет ожидания выполнения этого события. Тоесть алгоритм должен быть такой. i=1 => ждём клика и занесение в excel из события => i++ и заново с i=2 и.т.д

Answer 1

Абстрагируясь от вопроса, зачем это вообще вам надо, я покажу пример асинхронного ожидания события

public class MyForm : Form
{
    WebBrowser _wb;
    public MyForm()
    {
        this.Width = 500;
        this.Height = 500;
        _wb = new WebBrowser() { Width = 500, Height = 500 };
        this.Controls.Add(_wb);
        LoadAndClick();
    }
    private async void LoadAndClick()
    {
        for (var i = 0; i < 10; i++)
        {
            var uri = $"https://google.ru?{i}";
            var tcs = new TaskCompletionSource<int>();
            WebBrowserDocumentCompletedEventHandler docCompleted = null;
            docCompleted = (s, e) =>
            {
                try
                {
                    // отписываемся
                    this._wb.DocumentCompleted -= docCompleted;
                    // тут какой то полезный код
                }
                finally
                {
                    // отмечаем, что событие отработало. 
                    tcs.TrySetResult(0);
                }
            };
            this._wb.DocumentCompleted += docCompleted;
            _wb.Navigate(uri);
            await tcs.Task; // ждем, когда событие сработает. 
            Debug.WriteLine($"{uri} processed");
        }
    }
}

В примере мы грузим странички одну за другой. Причем следующая загрузка начнется только после того, как предыдущая закончится.

Answer 2

Архитектурная схема не очень, разумнее всю логику унести в событие webBrowser1_DocumentCompleted, или использовать переменную в виде флага выставляемого из webBrowser1_DocumentCompleted и по ней продолжать обработку, но это не красиво. Использовать эвенты? Как архитектуру логики.

и судя по string urlo грузиться в цикле будет одна страница, но много раз :)

READ ALSO
Ошибка 6002, 6013, 6005 Entity Framework

Ошибка 6002, 6013, 6005 Entity Framework

Что можно сделать с ошибками такого рода или как их полечить? Код в базе менять нельзя

265
Как подключить mySQL к Python 3.6? [закрыт]

Как подключить mySQL к Python 3.6? [закрыт]

Уже насмотрелся разных видео по работе с субдНо ничего толкового так и не нашёл

227
Парсинг цифр из строки

Парсинг цифр из строки

Есть переменная:

214
Сайт на php и node

Сайт на php и node

Есть сайт на php mvc, я хочу с помощью node (node чтоб избежать большой нагрузки от больштй аудитории) реализовать чат между зарегистрированными...

354