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。
相关文章
相关标签/搜索