BackgroundWorker или чем я сегодня занимался.
Автор: admin Май.23.2009 Категория: Будни, Программирование
Утро началось для меня часов в 8, когда сестра проснулась и начала собираться на работу.
Встал и сразу ощутил боль в шее, больно поворачивать голову вправо. Такс, пора подушку убирать. :twisted:
Первым делом привел себя в порядок, поел, сел за комп. Включил в аську и увидел что заказчик скинул мне примерный алгоритм того что он хочет увидеть. Посидел, подумал… Я ему уже сделал некую часть, осталось за малым. Но это первый блин и конечно же комом.
Решил что пора заняться рефакторингом, причем солидным.
Так же взглянул в сторону XAML, по после 20-ти минут, отложил до лучших времен. Не совсем понял как допустим у объекта ListView изменить коллекцию колонок.
Начал кординально переписывать проект, и сразу же задумался о потоках, оно в принципе многопоточно, за исключением того что основной поток все равно вешается и это приводит к «эффекту зависшего окна»
.
Начал думать как все обойти, думать долго не пришлось, в принципе знал о классе BackgroundWorker *, но почему-то не использовал его
.
Начал все прикручивать, разбирать и т.п. Вобщем за сегодня ~1000 строк кода я налопатил, немного мне это надоело. Пошел смотреть TV, а именно программу «Большая разница». Хм, улыбнуло.
Вобщем что из этого вышло:
У компонента есть обработчик события — DoWork. Имено там пишем код который будет выполняться в отдельном потоке.
Внимание! BackgroundWorker не покрывает проблему обращения к контролам, для этого следует использовать Invoke.
Следующий обработчик который меня заинтересовал, это RunWorkerCompleted. Данное событие не отработает если была вызвана отмена — метод CancelAsync().
Следующее, это конечно же реализация прерывание работы BackgroundWorker’a.
Для этого:
- Вызывается метод CancelAsync();
- Именно в той длинной операции используется следующий код:
if (backgroundWorker1.CancellationPending)
{
e.Cancel = true;
return;
}
* доплнительная информация на rsdn
Наверное все…
Месяцев 4-5 назад, я писал класс для парсинга Гугла. Собственно вот он, да, в нем есть что переделывать, а что? Достаточно отписаться и я возможно этим займусь
, а пока он позволяет следующее:
- Поддержка WebProxy;
- Изменение UserAgent’a;
- Поиск по всем результатам;
- Отбрасывать ссылки в которых содержится ключевое слово «google»;
- Устанавливать колличество выводимых результатов;
- Устанавливать начальную страницу, с которой будет начат парсинг;
- Используется сервис гугла, генерирующий минимальную по объему страницу;
Пример поиска, парсится 1 страница и первые 100 результатов:
var google = new GoogleParser("C#");
var result = google.GetResult();
var str = "";
foreach (var s in result)
{
str += s;
}
textBox1.Text = str;
Вот так читать все страницы:
var google = new GoogleParser("C#");
var str = "";
while (google.Read())
{
var result = google.GetResult();
foreach (var s in result)
{
str += s;
}
}
textBox1.Text = str;
Май 24th, 2009 on 08:06
Никуя не понял из того что здесь написано :(((
изучение «C» в плане, и довольно таки далеком :(
Май 25th, 2009 on 01:15
А я наоборот все понял, аж скучн… Хотя на сях года 2-3 не писал уж)
Май 25th, 2009 on 10:22
лучше поздно, чем никогда
Май 26th, 2009 on 12:59
Да… могу сказать таковое про тебя) Молодец, вижу уже что то пишешь более ли менее =) А помню времена…
Май 26th, 2009 on 13:32
вспоминаю как я калькулятор писал… ппц…
p.s. пасиба)
Октябрь 18th, 2011 on 20:53
Вот эта фраза непонятна:
«Внимание! BackgroundWorker не покрывает проблему обращения к контролам, для этого следует использовать Invoke.»
Вроде бы BackgroundWorker и сделан для того, чтобы Invoke самому не использовать.
Октябрь 31st, 2011 on 09:28
Это говорит лишь о том, что нельзя обращаться напрямую к контролам из DoWork