Формы C #: Как показать форму, когда инициализация занимает много времени? - PullRequest
1 голос
/ 16 августа 2011

У меня есть форма ac #, и время инициализации занимает некоторое время (получение информации с сервера и заполнение TreeView).Прямо сейчас код выглядит примерно так:

public class myForm : Form
{
    InitializeComponent();
    List<Location> locations = getServerLocations(); // Server call

    foreach( Location loc in locations )
    {
        List<POI> POIs = loc.getLocationPOIs(); // Server call
        foreach( POI poi in POIs ) 
        {
             List<POIDetails> = poi.getPOIDetails(); // Server call
             ....
        }
    }
}

Вы поймете, что я думаю ... Итак, есть большое дерево, и я знаю, что не могу совершать вызовы вплоть доПользователь расширяет дерево.Но цель в том, чтобы я просто хотел, чтобы форма отображалась с надписью «загрузка ...» или что-то на полоске инструментов, пока происходит вся обработка и получение сервером.

Сейчас мне кажется, что я еще не загрузил приложение, потому что пользователю ничего не покажется, пока все вызовы не будут завершены.

Ответы [ 3 ]

7 голосов
/ 16 августа 2011

Вы не должны выполнять длительную обработку в потоке пользовательского интерфейса - вместо этого переместите это в другой поток, то есть, используя BackgroundWorker. Сначала вы можете отобразить экран «Загрузка» и, как только фоновый работник завершит работу, обновить свой пользовательский интерфейс с вашей древовидной структурой.

2 голосов
/ 16 августа 2011

Вы должны работать с многопоточным процессом, чтобы можно было отделить процесс, который занимает время, от остальной части процесса.Вот блог, который может вам помочь. .NET 4.0 и System.Threading.Tasks

0 голосов
/ 16 августа 2011

Выполнение инициализации в отдельном потоке является предпочтительным способом. Но если вы вынуждены запускать его в потоке пользовательского интерфейса, попробуйте вызвать Application.DoEvents () сразу после вызова .Show () или .ShowDialog () вашей формы.

Если форма появляется, она все равно не будет реагировать на действия пользователя до завершения инициализации. Поэтому запуск инициализации в отдельном потоке - лучшее решение.

...