1) Не поставяйте RunWorkerAsync
като метод за извикване. Всъщност не изпълнява метода, който мислите. Това, което наистина трябва да поставите там, е нещо подобно:
this.Invoke(new MethodInvoker(MethodToUpdateUI));
MethodToUpdateUI
трябва да бъде някакъв нов метод, който създавате, който конкретно прави всички актуализации на потребителския интерфейс, които трябва да бъдат направени в този контекст.
2) Няма нужда от InvokeRequired
. Вие сте във фонова тема. Винаги ще се изисква извикване.
Честно казано, цялата схема на if(invoke required) call myself else do stuff
е странна конструкция, която не харесвам. InvokeRequired
трябва да се използва доста рядко. Почти винаги трябва да знаете дали сте в нишката на потребителския интерфейс или фоновата нишка, ако не го направите, има вероятност нещо да не е наред (или винаги сте в едната или другата и просто не знаете коя, или не трябва да бъде недетерминистично). Обикновено това означава да имате методи, които трябва да се изпълняват в нишката на потребителския интерфейс. Ако вече сте в нишката на потребителския интерфейс, вие просто ги извиквате, ако сте във фонова нишка и знаете това, тогава първо извиквате Invoke
.
Освен това Invoke
работи добре, дори ако го извикате, когато вече сте в нишката на потребителския интерфейс, така че наистина няма значителни отрицателни последици от просто извикване на Invoke
, независимо дали сте във фонова нишка или вече сте в потребителския интерфейс резба.
3) Обикновено е най-добре да отделите кода за решаване на бизнес проблеми от UI кода. Миризмата на код трябва да се извиква от манипулатора на DoWork. Ако това е точно към края, вероятно трябва да добавите манипулатор на събития към RunWorkerCompleted
. Ако извиквате това периодично, за да актуализирате потребителския интерфейс с напредъка на работника, трябва да използвате ReportProgress
и да обработвате събитието ProgressReported
. За да получите информация от потребителския интерфейс за използване в дълго изпълнявана задача, трябва да получите достъп до нея, преди да стартирате фоновата задача. За изключителни случаи, които не са нито един от тези, може да е подходящо да използвате Invoke
, но останалите случаи трябва да са редки.
person
Servy
schedule
19.12.2012
bw.RunWorkerAsync
отbw.DoWork
? - person Mike Park   schedule 20.12.2012