Рейтинг:
5
Sonhospa
Большое тебе спасибо, Ричард! Изучив различные источники за последние выходные, я нашел именно этот метод, попробовал его и - вуаля, он работает!
Поскольку я не являюсь профессиональным программистом, для меня также было важно, где именно в моем коде я должен был его разместить. Вы не упомянули об этом, но я бы неявно понял, что нужно просто изменить свою старую линию. Кроме того, следуя другой подсказке, я вставил "readTask.GetAwaiter()" перед "readTask.Start()".
Однако спасибо, и поскольку это "недостающая часть", о которой я изначально просил, я принял ваше предложение как решение... если вы не возражаете ;-)
Рейтинг:
1
Dave Kreskowiak
WaitAll-это блокирующий вызов. Поток пользовательского интерфейса не будет делать ничего другого до тех пор, пока все задачи не будут завершены, тем самым удовлетворяя условию, которое ищет WaitAll.
Если вы хотите рассчитать время этой операции, вам, вероятно, будет лучше создать метод, который задачи вызывают в потоке пользовательского интерфейса, чтобы удалить задачи из списка задач, и когда список достигнет значения 0, вы можете остановить таймер и включить/отключить кнопки.
Sonhospa
Привет, Дэйв, спасибо, что заглянул. Я не понимаю, что вы имеете в виду. Наличие длительных задач в потоке пользовательского интерфейса также заморозит пользовательский интерфейс, или нет? Извините, это немного сложно для моего мозга...
Dave Kreskowiak
Задачи, которые вы запустили, не находятся в потоке пользовательского интерфейса. Они вообще не вешают пользовательский интерфейс. Это призыв к WaitAll, который делает это.
Это не вопрос размещения WaitAll в правильном месте. Речь идет о том, чтобы не использовать его вообще!
Sonhospa
Да, это я понимаю. Я имею в виду, как я мог бы добиться того, чтобы мое "резюме" (количество и продолжительность) находилось в потоке пользовательского интерфейса, то есть после того, как все потоки будут закончены? Из того, что я читал, задание.WaitAll именно для этой цели... или я неправильно понял?
Dave Kreskowiak
Если вы хотите повесить свой пользовательский интерфейс на время выполнения задач, используйте WaitAll. Это блокирующий вызов, который означает, что никакой другой код в потоке WaitAll не будет выполняться до тех пор, пока он не вернется. Если вы вызовете WaitAll в потоке пользовательского интерфейса (поток, в котором запускается ваше приложение), пользовательский интерфейс вообще ничего не будет делать до тех пор, пока WaitAll не вернется и приложение не вернется в состояние ожидания. Это позволит насосу сообщений в потоке пользовательского интерфейса запускать и обрабатывать сообщения, лизать щелчки мыши и рисовать сообщения.
Если вы не хотите вешать свой пользовательский интерфейс, вам придется проявить настоящий творческий подход и не использовать ни один из методов ожидания.
Sonhospa
Я имею в виду, как я мог бы добиться того, чтобы мое "резюме" (количество и продолжительность) находилось в потоке пользовательского интерфейса, то есть после того, как все потоки будут закончены? Я уже удалил Wait, но "вы должны стать действительно творческими", я не ожидал, что в качестве совета и возможного решения на этом форуме. Но все равно спасибо.
Dave Kreskowiak
Я уже говорил вам об одном возможном решении.
Sonhospa
Эй, чувак, я впервые пытаюсь это сделать и уже признался, что не понимаю, что ты имеешь в виду. Если вы не хотите помочь, просто не отвечайте. Желаю хорошо провести остаток выходных.
Dave Kreskowiak
Итак, каково ваше представление о помощи? Код написан для вас? Извините, но это не произойдет прямо сейчас, когда я печатаю это дерьмо на своем телефоне, сидя в приемной больницы.
Мир вышел. С меня хватит.
Sonhospa
Извините за больничную историю, я искренне надеюсь, что ничего серьезного и все получится хорошо! Только не позволяйте им давать вам что-нибудь на латыни, это было бы бесполезно, если бы вы не изучали ее.
К вашему сведению: я собираюсь следовать подсказке другого потока форумов, где "Task.Result" хранится в переменной. Мир!