Как открыть окно в отдельной теме? - PullRequest
4 голосов
/ 06 апреля 2011

Я хотел бы сделать:

Window newWindow = new Window();
newWindow.Show();

while (true) 
{
    Console.Write("spin");
}

Т.е. я делаю интенсивные вычисления в главном окне, но в этом новом окне (где я пытаюсь показать индикатор занятости с анимацией) не отвечает (он заморожен) ...

Поэтому я попытался сделать:

Thread thread = new Thread(() =>
{
    Window newWindow = new Window();
    newWindow.Show();
});

thread.SetApartmentState(ApartmentState.STA);
thread.Start();

while (true) 
{
    Console.Write("spin");
}

Но новое окно все еще заморожено и т. д. Кто-нибудь знает, что здесь не так?

Ответы [ 4 ]

8 голосов
/ 06 апреля 2011

Вы не должны пытаться открыть новое окно в своем собственном потоке.

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

Однако вы можете сделать это самостоятельно, используя потоки или Task / Task<T>. Просто не забудьте использовать Dispatcher или TaskScheduler, созданный из контекста пользовательского интерфейса, для всего, что будет обновлять пользовательский интерфейс, например для уведомления о ходе выполнения.

2 голосов
/ 06 апреля 2011

Вам необходимо запустить отдельный цикл сообщений в новом потоке, используя класс Application.

2 голосов
/ 06 апреля 2011

Вы не - есть только один поток GUI. Если вам нужно блокировать работу, этот материал должен идти в фоновом потоке.

1 голос
/ 15 июня 2011

@ SLaks Это может быть очень полезно, если вы пытаетесь запустить новое окно из консольного приложения. Один из вариантов - использовать showDialog(); Но тогда его трудно закрыть.

Если вы используете Show(), а затем Application.run() (это основные моменты использования класса Application для запуска нового цикла сообщений)

Когда вы вызываете Application.Exit() в главном потоке консоли, приложение фактически закрывается;

используя showDialog(), вы должны прервать поток, а затем подождать, пока окно не получит какой-либо ввод, то есть навести курсор мыши или сфокусироваться. иначе это навсегда останется на выходе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...