Най-добрият начин да събудите нишка, за да излезете? ° С#

Създавам нишка (само една), за да свърша някаква работа и тя до голяма степен се грижи за себе си, като няма достъп до никакви данни извън протектора, освен извикването на callback(), за да види дали потребителят иска да излезе (също изпраща отчет за състоянието обратно на основна нишка за показване в GUI).

Когато затварянето затваря exe, бих искал да събудя нишката и да я затворя, кой е най-добрият начин да направя това? Обратното извикване вече казва дали потребителят иска да се откаже, така че сега проблемът е използването на Thread.Sleep и събуждането му преждевременно, за да може да се откаже, вместо да поддържа процеса активен за още няколко секунди или минути. Тази функция би била добра за спиране, за да излезете по-бързо.


person Community    schedule 26.01.2010    source източник


Отговори (3)


Друг подход би бил както следва:

Имайте ManualResetEvent в програмата си и извикайте Set, когато искате нишката да завърши и да се затвори. Вместо да извиквате Thread.Sleep във вашата работна нишка, извикайте event.WaitOne и предайте TimeSpan обект. Ако събитието бъде сигнализирано, вашата работна нишка ще се събуди преди изтичането на времето за изчакване - WaitOne ще върне true.

person Dave Cluderay    schedule 26.01.2010
comment
Дори и с това решение бих препоръчал да използвате и BackgroundWorker. - person Mark Byers; 26.01.2010

Използвайте BackgroundWorker или задайте IsBackground свойството на true, тогава то няма да се запази вашето приложение е отворено.

Бих препоръчал BackgroundWorker, но последният е бързо решение.

Актуализация

Оригиналният автор промени изискванията си след публикуването на въпроса (вижте коментарите, прикачени към този въпрос). Актуализация за отговор следва:

Ако искате да спрете операция във фонов режим, без да затваряте приложението, моля, вижте CancelAsync метод. Освен това не използвайте Thread.Sleep - използвайте WaitHandle и извикайте WaitOne за какво трябва да изчакате.

person Mark Byers    schedule 26.01.2010
comment
Ще го погледна, как да му кажа да се събуди от съня си? -edit- предполагам, че мога да го използвам, за да не предотвратявам прекратяването, но бих искал да го събудя, когато потребителят щракне върху стоп. Предполагам, че няма да се занимавам? (Опитът да убиеш нишката изглежда лош) - person ; 26.01.2010
comment
Не трябва да правите нищо с фоновата нишка. Освен ако няма някакво конкретно почистване, от което се нуждае вашата нишка, преди приложението да затвори, можете просто да затворите приложението и да оставите нишката да умре. Фоновите нишки не могат да държат приложението отворено. - person Mark Byers; 26.01.2010
comment
Бях по-загрижен да позволя на потребителя да го спре рано и да започне друга команда, без да чака в моя коментар - person ; 26.01.2010
comment
Не разбирам... ако се притеснявате повече от спирането на нишката без затваряне на приложението, защо не го поставихте във въпроса си? Ако трябва да спрете вашата нишка в моменти, различни от прекратяване на приложението, трябва да използвате различно решение. Може би трябва да актуализирате въпроса си, за да стане ясно, защото текущият ви въпрос не отразява вашите изисквания. - person Mark Byers; 26.01.2010

Трябва да се съглася с Марк. Единственото ясно нещо по въпроса ви е, че трябва да преразгледате стратегията си за нишки. Казвате, че имате нишка, която върши работа, но след това казвате, че искате да я събудите?

Нишката чака ли работа? Ако е така, заспивайте на по-кратки цикли и проверявайте за излизане по-често или използвайте събитие за нулиране. Най-добрият начин да събудите нишка е да не я заспивате. Направете каквото трябва и излезте. Винаги проверявайте за сигнали за прекъсване, в каквато и форма да ги прилагате, преди да започнете каквито и да било дълги операции и отново, ако трябва да заспивате нишката, направете го на кратки цикли.

Нишката заета ли е и искате да я прекъснете? Може да нямате друг избор, освен да го убиете, ако не можете да го инструментирате така, че да може да реагира на сигнали за прекъсване своевременно.

person Sky Sanders    schedule 26.01.2010