WPF:Application Management應用程序管理(2)

F1:Dispatcher 類:提供用於管理線程工做項隊列的服務。編程

  1. Dispatcher 可爲特定線程維護其按優先順序排列的工做項隊列。
  2. 當在線程中建立了 Dispatcher 時,它將成爲可與該線程關聯的惟一 Dispatcher,即便 Dispatcher 已經關閉。若是 Dispatcher 已經關閉,它將沒法從新啓動。??
  3. 在 WPF 中, DispatcherObject 只能經過與它關聯的 Dispatcher 進行訪問。 例如,後臺線程不能更新與 UI 線程中的 Dispatcher 關聯的 Button 內容。爲了使該後臺線程可以訪問 Button 的 Content 屬性,該後臺線程必須將此工做委託給與該 UI 線程關聯的 Dispatcher。使用 Invoke 或 BeginInvoke 來完成此操做。 Invoke 是同步操做,而 BeginInvoke 是異步操做。該操做將按指定的 DispatcherPriority 添加到 Dispatcher 的隊列中。
  4. 若是對某個已關閉的 Dispatcher 調用 BeginInvoke,則返回的 DispatcherOperation 的狀態屬性將設置爲 Aborted。
  5. 派生自 DispatcherObject 的對象具備線程關聯。派生自 Freezable 的對象在凍結時是自由線程的。除 DisableProcessing 之外,Dispatcher 上的全部方法均是自由線程的。

F2:DispatcherObject 類:與 Dispatcher 關聯的對象。其惟一個屬性爲Dispatcher.瀏覽器

  1. 只有在其上建立 Dispatcher 的線程才能夠直接訪問 DispatcherObject。若要從不一樣於在其上建立 DispatcherObject 的線程的某個線程訪問 DispatcherObject,請對與 DispatcherObject 關聯的 Dispatcher 調用 Invoke 或 BeginInvoke。
  2. 須要強制線程安全的 DispatcherObject 的子類能夠經過對全部公共方法調用 VerifyAccess 來強制線程安全。這樣能夠保證調用線程是在其上建立 DispatcherObject 的線程。
  3. 沒法單獨對 DispatcherObject 進行實例化;也就是說,全部構造函數都是受保護的。
  4. 派生自 DispatcherObject 的對象具備線程關聯。派生自 Freezable 的對象在凍結時是自由線程的。

F3:Thread 類:建立和控制線程,設置其優先級並獲取其狀態。安全

  1. 一個進程能夠建立一個或多個線程,以執行與進程關聯的程序代碼的一部分。 使用 ThreadStart 委派或 ParameterizedThreadStart 委託指定的其餘線程執行的程序代碼。 ParameterizedThreadStart 委託容許您將數據傳遞給線程的過程。
  2. 對於其存在狀態的持續時間,線程始終爲一個或多個定義的狀態中 ThreadState。 計劃的優先級別,如中定義的 ThreadPriority, ,能夠請求對某個主題,但不是能保證遵循由操做系統。

F4:ApartmentState 枚舉:指定 Thread 的單元狀態。多線程

  1. MTA Thread 將建立並進入一個多線程單元。
  2. STA Thread 將建立並進入一個單線程單元。
  3. Unknown 還沒有設置 ApartmentState 屬性。
  4. 單元是進程內部具備相同線程訪問要求的對象的邏輯容器。 同一單元中的全部對象均可以接收從該單元中的任何線程發出的調用。 .NET Framework 不使用單元,託管對象本身負責以線程安全的方式使用全部共享資源。

F5:Thread.IsBackground 屬性:線程是後臺線程或一個前臺線程。 後臺線程均與前臺線程相同的,只不事後臺線程不會阻止進程終止。 一旦屬於某個進程的全部前臺線程都已終止,公共語言運行時將結束該進程。任何剩餘的後臺線程將中止,其並不會完成剩餘工做。異步

好比以下:當前臺線程完成時到10時,後臺線程也只完成到10,並不會執行其最後一句輸出:函數

clipboard.png

class Test
{
    static void Main()
    {
        BackgroundTest shortTest = new BackgroundTest(10);
        Thread foregroundThread = 
            new Thread(new ThreadStart(shortTest.RunLoop));
        foregroundThread.Name = "ForegroundThread";

        BackgroundTest longTest = new BackgroundTest(50);
        Thread backgroundThread = 
            new Thread(new ThreadStart(longTest.RunLoop));
        backgroundThread.Name = "BackgroundThread";
        backgroundThread.IsBackground = true;

        foregroundThread.Start();
        backgroundThread.Start();
    }
}

class BackgroundTest
{
    int maxIterations;

    public BackgroundTest(int maxIterations)
    {
        this.maxIterations = maxIterations;
    }

    public void RunLoop()
    {
        String threadName = Thread.CurrentThread.Name;

        for(int i = 0; i < maxIterations; i++)
        {
            Console.WriteLine("{0} count: {1}", 
                threadName, i.ToString());
            Thread.Sleep(250);
        }
        Console.WriteLine("{0} finished counting.", threadName);
    }
}

F6:Dispatcher.Run 靜態方法:主執行幀將繼續執行,直至 Dispatcher 關閉。oop

  1. Dispatcher 將經過循環處理事件隊列。該循環也稱爲「幀」。一般,初始循環由應用程序經過調用 Run 啓動。
  2. 保持Dispatcher上的線程繼續,暫時不關閉線程。

F7:Application.Startup 事件:在調用 Application 對象的 Run 方法時發生。包括:ui

  1. 處理命令行參數。
  2. 打開主窗口。
  3. 初始化應用程序範圍的資源。
  4. 初始化應用程序範圍的屬性。

擴展:this

  1. 可使用 XAML 以聲明方式指定主窗口和應用程序範圍的資源(分別爲 StartupUri 和 Resources)。 可是,應用程序的資源或主窗口有時只能在運行時以編程方式肯定。 此外,只能以編程的方式使用應用程序範圍的屬性和命令行參數。
  2. 經過處理 Startup 事件能夠執行編程初始化,包括如下這些:spa

    1. 獲取並處理命令行參數,這些參數可從傳遞給 Startup 事件處理程序的 StartupEventArgs 類的 Args 屬性獲取。
    2. 使用 Resources 屬性初始化應用程序範圍的資源。
    3. 使用 Properties 屬性初始化應用程序範圍內的屬性。
    4. 實例化並顯示一個(或多個)窗口。
  3. 命令行參數還能夠經過調用 Environment 對象的靜態 GetCommandLineArgs 方法來獲取。 可是,執行 GetCommandLineArgs 這須要徹底授信。
  4. 若是使用 XAML 設置 StartupUri,則在處理 Startup 事件以前,不能從 Application 對象的 MainWindow 屬性或 Windows 屬性訪問建立的主窗口。 若是須要在啓動期間訪問主窗口,則須要經過 Startup 事件處理程序手動建立新的窗口對象。
  5. 若是應用程序使用 CredentialPolicy 指定憑據策略,則須要在引起 Startup 以後設置 CredentialPolicy;不然 WPF 會在已引起 Startup 事件以後直接將其設置爲默認內部策略。
  6. 傳遞給 Startup 事件處理程序的命令行實參與傳遞給 XAML 瀏覽器應用程序 (XBAP) 的 URL 查詢字符串形參是不相同的。

F8:WindowsFormsApplicationBase 類:提供與當前應用程序相關的屬性、方法和事件。

clipboard.png

  1. My.Application 對象由如下類組成:

    1. ApplicationBase 提供在全部項目中可用的成員。
    2. WindowsFormsApplicationBase 提供在 Windows 窗體應用程序可用的成員。
    3. ConsoleApplicationBase 提供在控制檯應用程序可用的成員。
  2. My.Application 對象公開的屬性返回只與當前應用程序或 DLL 關聯的數據。 沒法利用 My.Application 更改任何系統級別的信息。

F9:Application.LoadComponent 方法:加載位於指定統一資源標識符 (URI) 處的 XAML 文件。

  1. XAML 文件能夠是應用程序代碼文件(配置爲 Microsoft Build Engine (MSBuild) 頁面項),也能夠是應用程序數據文件(資源文件、內容文件或源站點文件;
  2. 靜態成員 LoadComponent(Uri) 必須將返回值顯式轉換爲與 XAML 文件的根元素相同的類型。

F10:Application.DispatcherUnhandledException 事件:在異常由應用程序引起但未進行處理時發生。

  1. 默認狀況下,WPF 捕獲未經處理的異常,經過一個對話框通知用戶發生了異常(用戶能夠從該對話框報告異常),而且自動關閉應用程序。
  2. 可是,若是應用程序須要從一個集中位置執行自定義的未經處理的異常處理,則應處理 DispatcherUnhandledException。
  3. 對於在主 UI 線程上運行的代碼未處理的每一個異常, Application 都將引起一個 DispatcherUnhandledException。
  4. 若是某個異常既未在後臺 用戶界面 (UI) 線程(自身具備 Dispatcher 的線程)上處理,也未在後臺輔助線程(不具備 Dispatcher 的線程)上處理,則該異常不會轉發到主 UI 線程。 所以不會引起 DispatcherUnhandledException。 在這些狀況下,您將須要編寫代碼以執行如下操做:

    1. 在後臺線程上處理異常。
    2. 將這些異常調度到主 UI 線程。
    3. 在主 UI 線程上再次引起這些異常而不進行處理,以即可以引起 DispatcherUnhandledException。
  5. 向 DispatcherUnhandledException 事件處理程序傳遞一個 DispatcherUnhandledExceptionEventArgs 參數,該參數包含與異常有關的上下文信息,這些信息包括:

    1. 異常 ( Exception)。
    2. 發出異常的 Dispatcher ( Dispatcher)。
  6. 可使用這些信息肯定異常是否能夠恢復。 例如,能夠恢復的異常多是一個 FileNotFoundException,而不可恢復的異常多是一個 StackOverflowException。
  7. 當您處理一個來自 DispatcherUnhandledException 的未經處理的異常,而且不但願 WPF 繼續處理該異常時,須要將 Handled 屬性設置爲 true。
相關文章
相關標籤/搜索