Как да заредите втората форма асинхронно и да я стартирате, когато потребителят щракне върху бутона

Основният формуляр съдържа бутон, който извиква вторичния формуляр (формуляр 2).

Формуляр 2 съдържа System.Threading.Thread.Sleep(10000) пауза за симулиране на сложна работа (зареждане на компоненти, множество изображения, изобразяване).

Задача: Незабавно показване на формуляр 2 при натискане на бутон в основния формуляр. В този случай, преди да натисне бутона, потребителят не трябва да вижда форма 2 (дори да мига). Потребителят ще натисне бутона не по-рано от 10 секунди след стартиране на програмата.

Опитах опции с изпълнение в различна нишка, опитах се да използвам само Task, BackgroundWorker, ThreadPool. Не работи, като правило, проблемът е, когато формата се извиква от втория бутон.

каква е идеята

Един пример за това как се опитах да разреша проблема:

Цялата дълга логика трябва да бъде поставена в конструктора на втората форма (мисля, че това е логично). И по-нататък в началото на първия, в отделен поток, за да създадете втория формуляр. И го имайте предвид. Като щракнете върху бутона, можете лесно да го покажете. Нещо като това:

Единственият проблем с този код е, че ако потребителят щракне върху бутона ПРЕДИ формулярът да се зареди, всичко ще се срине. Но тук можете или просто да проверите за Null, или да използвате задачи и да проверите дали задачата е изпълнена, когато бутонът е натиснат).

Така че не правете неща като Thread.Sleep() . В никакъв случай не трябва да извиквате методи в нишката на потребителския интерфейс (да кажем SomeMethod(…)), които връщат Task, само SomeMethod(…).Result – това причинява блокиране.

Да кажем, че има метод, който връща JSON:

Това е грешният начин да го направим, така стигаме до задънена улица.

Вместо това би било правилно да направите следното:

Решаваме задачите за освобождаване на UI нишката по този начин: добавямемодификатора async към манипулатора на събития (това са Load, Click и т.н., основно те получават async void). След това вътре в него изпълняваме някаква задача с помощта на await.