|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
Есть два окна AuthenticateWindow и MainWindow , разметка и код ниже. Все очень упрощенно, но передает суть и воспроизводит симптомы (желающие могут скопипастить). Если в конструкторе окна MainWindow юзать тип Thread - все будет работать хорошо, окошко покажется, поток будет работать сам по себе. Если использовать тип Task , то интерфейс подвесится, а именно, окно MainWindow не будет отображаться пока задача не отработает, т.е. пока не пройдет 5 секунд. Собсно вопрос, есть ли возможность использовать класс Task без подвешивания интерфейса? Потому что мне очень нужен механизм отмены задачи и ее свойство Status . Впрочем, если что-то подобное есть у класса Thread - проблема так же решится. Винда 7, .Нет 4.0. Важное условие, от TaskScheduler.FromCurrentSynchronizationContext() отказаться не могу. Код: xml 1. 2. 3. 4.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
MainWindow: Код: xml 1. 2. 3.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 16:59 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
monstrilla, Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 18:20 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 18:48 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
капитанская дочкаmonstrilla, Код: c# 1.
Это то же самое. капитанская дочкаmonstrilla, кстати есть такая штукенция Эта штука после появления Task больше не нужна. Да и до появления Task она была ни к чему. капитанская дочкаи еще говорят что эта штука тоже полезнаяЭто тут не причём. monstrillaВ Task.Factory.StartNew(TestMethod) в данном случае нужно явно указать дефолтный шедулер, запускающий задачу через пул потоков или отдельный поток. Подробнее: "Синхронизация асинхронных операций с главным потоком приложения" . ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 19:14 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
Алексей Ккапитанская дочкаmonstrilla, Код: c# 1.
Это то же самое. тогда у меня наверное комп особенный раз у меня так работает или может быть потому что It uses the default task scheduler. Алексей Ккапитанская дочкаmonstrilla, кстати есть такая штукенция Эта штука после появления Task больше не нужна. Да и до появления Task она была ни к чему. с этим пожалуй соглашусь хотя и есть некоторые но. ну да ладно Алексей Ккапитанская дочкаи еще говорят что эта штука тоже полезнаяЭто тут не причём. что даже parallel.invoke http://ru.wiktionary.org/wiki/%D0%BD%D0%B8_%D0%BF%D1%80%D0%B8_%D1%87%D1%91%D0%BC]нИ при [пробел] чем ? или может быть тс не то что полезно а даже вредно знать о существовании класса parallel? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 19:34 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
капитанская дочкаАлексей Кпропущено... Это то же самое. тогда у меня наверное комп особенный раз у меня так работает или может быть потому что It uses the default task scheduler. Ага, вижу, в 4.5 такое добавили. Лучше поздно чем никогда. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 20:05 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
Что-то не понял, начальный код вполне рабочий. Автор, собери тестовый солюшен и прикрепи сюда. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 20:35 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
Алексей К, Parallel.Invoke - видимо имелось в виду замена: Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
на что-то вроде: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Очевидно, разница в том, что в первом случае код "полетит" дальше, не дожидаясь, когда окна "откроются и закроются", во втором случае, хоть исполнение и будет параллельным, но метод завершиться только, когда окна "открются и закроются". Визуально разницы нет, да и по ресурсам скорее тоже. Стоит отметить, что Parallel предствалеят большой интерес, особенно когда речь идет о параллельных циклах, но это уже пожалуй дело автора топика. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 23:04 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
МСУЧто-то не понял, начальный код вполне рабочий. Автор, собери тестовый солюшен и прикрепи сюда. Код действительно рабочий, однако Код: c# 1.
будет запускаться в том же Thread, что и UI, а значит придется ждать 5 секунд, чего автор топика пытается избежать. Можно воспользоваться разными опциями для решения этой задачи. Например, как было указано (и пожалуй самый простой): Код: c# 1.
Или, например, такие варианты: Код: c# 1. 2.
Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 23:59 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
iMrTidyАлексей К, Parallel.Invoke - видимо имелось в виду замена: Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
на что-то вроде: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Очевидно, разница в том, что в первом случае код "полетит" дальше, не дожидаясь, когда окна "откроются и закроются", во втором случае, хоть исполнение и будет параллельным, но метод завершиться только, когда окна "открются и закроются". Визуально разницы нет, да и по ресурсам скорее тоже. Стоит отметить, что Parallel предствалеят большой интерес, особенно когда речь идет о параллельных циклах, но это уже пожалуй дело автора топика.Понятно что можно через Parallel, но не вижу смысла запускать через него одну задачу. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 05:32 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
МСУЧто-то не понял, начальный код вполне рабочий. Автор, собери тестовый солюшен и прикрепи сюда.Нет! Task из конструктора MainWindow будет запущен в UI потоке. Это один из маразмов TPL 4.0. В 4.5 это исправлено, добавлен человеческий Task.Run, который предложил(а) использовать капитанская дочка . ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 05:39 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
Алексей КМСУЧто-то не понял, начальный код вполне рабочий. Автор, собери тестовый солюшен и прикрепи сюда.Нет! Task из конструктора MainWindow будет запущен в UI потоке. Это один из маразмов TPL 4.0. В 4.5 это исправлено, добавлен человеческий Task.Run, который предложил(а) использовать капитанская дочка . А да, постоянно забывают про этот UI поток. В WinRT, к примеру, нужен вот такой финт Код: c# 1. 2.
Причем, в остальных случаях Task.Factory.StartNew вполне приемлем. Вот нужно как-то во вью модель прокинуть этот диспетчер. А вью модель portable. Везде засада. Бесит. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 09:47 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
МСУАлексей Кпропущено... Нет! Task из конструктора MainWindow будет запущен в UI потоке. Это один из маразмов TPL 4.0. В 4.5 это исправлено, добавлен человеческий Task.Run, который предложил(а) использовать капитанская дочка . А да, постоянно забывают про этот UI поток. В WinRT, к примеру, нужен вот такой финт Код: c# 1. 2.
Причем, в остальных случаях Task.Factory.StartNew вполне приемлем. Вот нужно как-то во вью модель прокинуть этот диспетчер. А вью модель portable. Везде засада. Бесит.Для синхронизации из любого места сделал статические SyncScheduler, SyncFactory и методы ContinueWithSync. Инициализирую SyncScheduler и SyncFactory при старте приложения. Теперь во ViewModel ничего прокидывать не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 10:11 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
МСУА вью модель portable.Для portable вместо static class использовать interface + DI . ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 10:13 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
всем спасибо. действительно, нужно было юзать дефолтный шедулер, на stackoverflow ответили. я вот всегда думал, что задача запускается всегда в новом потоке как Thread, например. Шилд обманывает, значит :( авторTask.Factory.StartNew(TestMethod, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default); Task.Run в 4.0 отсутствует ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 10:24 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
monstrillaвсем спасибо. действительно, нужно было юзать дефолтный шедулер, на stackoverflow ответили. я вот всегда думал, что задача запускается всегда в новом потоке как Thread, например. Шилд обманывает, значит :(Все врут! Никому верить нельзя! monstrillaTask.Run в 4.0 отсутствует ;)Об этом сразу было сказано. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 10:30 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
Алексей К, ну это больше капитанской дочке написано :) хотел перейти на 4.5, чтоб освоить и юзать преимущества (а по слухам они есть) async-await-ов. Но в одном из проектов есть у меня хитропопое окошко, а в нем не менее хитропопый функционал. Так вот, в 4.0 работает, а в 4.5 перестает работать (несмотря на заявленную обратную совместимость). День убил - толку ноль, пришлось откатиться. Будет время соберу выложу как-нибудь тестовый солюшн, думаю, будет интересно. еще вопросец, подскажите плз, хорошее чтиво по всем этим контекстам синхронизации, шедулерам, задачам. ибо плаваю, а пробелмы возникают регулрно. у шилда и нейгела только азы (по таскам), у трольсона вообще ничего, мсдн что-то совсем не нравится в этом плане. приходится какие-то обрывки гуглить и пытаться связать воедино. а статью почитаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 10:40 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
monstrillaеще вопросец, подскажите плз, хорошее чтиво по всем этим контекстам синхронизации, шедулерам, задачам. ибо плаваю, а пробелмы возникают регулрно. у шилда и нейгела только азы (по таскам), у трольсона вообще ничего, мсдн что-то совсем не нравится в этом плане. приходится какие-то обрывки гуглить и пытаться связать воедино.MSDN? monstrillaа статью почитаю.Я там описал наиболее важные, на мой взгляд, моменты. Предложил несколько практических подходов, заточенных именно под .Net4.0 . Может чем поможет. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 10:59 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
Алексей КМСУА вью модель portable.Для portable вместо static class использовать interface + DI . Какой static class? Через какой интерфейс мне прокинуть во вью модель такой диспетчер и его енум? Код: c# 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 11:27 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
МСУАлексей Кпропущено... Для portable вместо static class использовать interface + DI . Какой static class?ViewModel ведь может обратиться к static class? Мне кажется может. :-) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
МСУЧерез какой интерфейс мне прокинуть во вью модель такой диспетчер и его енум?Через самописный, но это для маразматиков. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 11:37 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
да, кстати, кому интересно и тем, кто столкнется с проблемой в будущем Task in child window suspend UI в ответе на вопрос есть линк(и), там более подробно расписано. прямые линки на всякий пожарный. Why Starting a New Task in the Task Parallel Library (TPL) Doesn’t Always Start a New Thread Why is TaskScheduler.Current the default TaskScheduler? Is Task.Factory.StartNew() guaranteed to use another thread than the calling thread? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 11:53 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
monstrillaTask.Run в 4.0 отсутствует ;) а фурманов знает? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 11:53 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
Алексей КМСУпропущено... Какой static class?ViewModel ведь может обратиться к static class? Мне кажется может. :-) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
Ну обратился, а дальше что? :) У нас же portable, никаких ссылок на Windows.winmd. Алексей КМСУЧерез какой интерфейс мне прокинуть во вью модель такой диспетчер и его енум?Через самописный, но это для маразматиков. :-) Писать свой диспетчер? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 11:56 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
капитанская дочкаmonstrillaTask.Run в 4.0 отсутствует ;) а фурманов знает? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 12:04 |
|
Задача, запущенная в дочернем окне подвешивает интерфейс
|
|||
---|---|---|---|
#18+
МСУАлексей Кпропущено... ViewModel ведь может обратиться к static class? Мне кажется может. :-) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
Ну обратился, а дальше что? :) У нас же portable, никаких ссылок на Windows.winmd.А там вот так получается: Код: c# 1.
Тут и без своих интерфейсов аж две абстракции над Dispatcher. Так что portable не пострадает. :-) Надо только где-нибудь глобально хранить ссылку на соответствующий TaskScheduler (или SynchronizationContext), и дело в шляпе.. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 12:10 |
|
|
start [/forum/topic.php?fid=21&fpage=21&tid=1441051]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
68ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
88ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 218ms |
0 / 0 |