2016-11-22 52 views
2

它是否存在任何通過UI線程(WinForms)執行事件處理程序時正在執行任務(而不是UI)的代碼?如何在執行任務時通過UI線程調用事件處理程序? (C#)

有** Threading.Timer **的回調函數,它的代碼總是從ThreadPool調用。回調可以引發一個事件。但是ThreadPool也可以處理它的處理程序。我訂閱的事件通過UI線程:

//UI 
    (Action<string>) MyEvent += (string result) => 
{ MyInput.Text += String.Format("server: {0}", result); }; //changes GUI 

    //The timer's callback, not UI: 
    MyEvent(result); //exception... 

回答

2

你需要告訴你的任務是繼續在UI線程上。自從您從UI線程啓動任務後,它將捕獲上下文。你可以這樣做是爲了告訴它繼續對捕獲的情景:

// Lets say task is your task that you started so tell it to continue like this 
Task UITask= task.ContinueWith(() => 
{ 
    // Do UI update here 
}, TaskScheduler.FromCurrentSynchronizationContext()); 

哦,如果你使用System.Windows.Forms.Timer代替,那麼事件將在UI線程自動閃光。

+1

另外,如果一個任務不是通過UI線程調用的,那麼在它之前,我們可以爲全局變量分配UI相關的TaskScheduler(調用UI線程中的'TaskScheduler.FromCurrentSynchronizationContext()')以便稍後訪問此調度程序。 – Mergasov

+0

是的,這是一個很好的觀點。 +1 – CodingYoshi

相關問題