2016-02-08 8 views
2

В приведенном ниже коде я вызываю метод, который открывает новое пользовательское окно. Однако, когда приложение выполняет некоторую длительную задачу, я все равно хочу активировать окно. Возможно ли это сделать в другом потоке или с помощью класса Task?WPF открыть новое окно в другом потоке

public static class CustomW 
{ 
    static Custom_Window_Chrome_Demo.ThemedWindow MsgBox(string Msgbx_TTL, string Msgbx_Contnt) 
    { 
     var w_mbx = new Custom_Window_Chrome_Demo.ThemedWindow(); 
     w_mbx.Width = 950; w_mbx.Height = 159; 
     w_mbx.Title = Msgbx_TTL; 

     Grid g = new Grid(); 
     StackPanel spM = new StackPanel(); 
     TextBlock TblckErrMsg = new TextBlock(); 
     //more settings...... 
    } 
} 

Это, как я пытался вызвать его,

public void newMsgBoxShow(string Msgbx_TTL, string Msgbx_Contnt) 
{ 
    System.Threading.Thread s = new System.Threading.Thread( 
     ()=> 
     CustomW.MsgBox(Msgbx_TTL, Msgbx_Contnt).Show() 
     ); 
} 

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

Вызывающий поток должен быть STA, так как многие компоненты пользовательского интерфейса требует этого

Что такое правильный путь для достижения требуемого результата?

+0

Где находится долгосрочная задача? –

+0

Ну, вы должны запустить свою длинную задачу на других потоках и оставить основной протектора для пользовательского интерфейса и не тяжелого материала. – Filip

+0

@NicoSchertler длинная задача - поиск длинного кода DB .. –

ответ

2

Используйте это:

Task.Factory.StartNew(new Action(() => 
      { 
       //your window code 
      }), CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); 

Когда новый поток создается с контексте текущей синхронизации он будет иметь возможность обновить пользовательский интерфейс . (когда текущая резьба является резьбой UI)

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

System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(()=> 
      { 
       //your window code 
      }));