簡體   English   中英

哪個線程在圖形用戶界面中運行代碼隱藏,例如 Windows Forms、WPF?

[英]which thread to run the code-behind in graphical user interface such as Windows Forms, WPF?

我知道只有 GUI 線程可以更新 UI 組件,為了計算長時間運行的任務,我們必須使用線程池來完成艱苦的工作並創建一個延續任務來使用同步上下文任務調度程序更新 UI。

這是一個簡單的 Windows Forms 應用程序

internal sealed class MyForm : Form 
{
    private readonly TaskScheduler m_syncContextTaskScheduler;
    
    public MyForm() 
    {
        m_syncContextTaskScheduler = 
            TaskScheduler.FromCurrentSynchronizationContext();
        Text = "Synchronization Context Task Scheduler Demo";
    }

    protected override void OnMouseClick(MouseEventArgs e) 
    {
        // This task uses the default task scheduler and executes on a thread pool thread
        Task<Int32> t = Task.Run(...);
        // This task uses the sync context task scheduler and execute on the GUI thread
        t.ContinueWith(task => Text = "Result: " + task.Result, 
            CancellationToken.None, 
            TaskContinuationOptions.OnlyOnRanToCompletion, 
            m_syncContextTaskScheduler);
        ...
        base.OnMouseClick(e);
   }
}

我的問題很簡單,哪個線程運行OnMouseClick方法等代碼隱藏? 執行此代碼隱藏的是 GUI 線程本身,所以只涉及兩個線程,一個 GUI 線程和一個工作線程? 還是一個工作線程在后面運行這段代碼,所以涉及一個 GUI 線程和兩個工作線程?

UI 生成事件的處理程序在 UI 線程中執行。 因此,在您的代碼中OnMouseClick也將在 UI 線程中執行。 Task將在調度程序定義的線程上執行(通常是線程池的線程)。

從技術上講,一些代碼可以在非 UI 線程中調用您的OnMouseClick ,但這是不好的做法,標准 WinForms/WPF 控件不會做這樣的事情。

另請注意,線程池通常有多個任務線程。

我在我的 MainWindow() ctor 和 btnMouseClick() 中對我的簡單 WPF 應用程序做了一個簡單的測試,我打印出線程 ID {System.Threading.Thread.CurrentThread.ManagedThreadId}並且都輸出 1,就像你可以想象。 所以是的,GUI 線程正在執行OnMouseClick中的代碼,那么您的新任務就在工作線程上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM