关闭
当前搜索:

当我们使用 MVVM 模式时,我们究竟在每一层里做些什么?

这篇文章不会说 MVVM 是什么,因为讲这个的文章太多了;也不会说 MVVM 的好处,因为这样的文章也是一搜一大把。我只是想说说我们究竟应该如何理解 M-V-VM,当我们真正开始写代码时,应该在里面的每一层里写些什么。...
阅读(34) 评论(0)

NullReferenceException,就不应该存在!

如果要你说出 .NET 中的三个异常,NullReferenceException 一定会成为其中一个;如果说出 .NET 中的一个异常,NullReferenceException 也会被大多数人说出来。它让这么多人印象深刻,是因为它在项目中实在是太常见了,常见到每一个 C#/.NET 入门者必然会遇到。然而,这个异常本不应该存在!...
阅读(42) 评论(0)

WPF 跨应用程序域的 UI(Cross AppDomain UI)

为自己写的程序添加插件真的是一个相当常见的功能,然而如果只是简单加载程序集然后去执行程序集中的代码,会让宿主应用程序暴露在非常危险的境地!因为只要插件能够运行任何一行代码,就能将宿主应用程序修改得天翻地覆哭爹喊娘;而根本原因,就在于暴露了整个托管堆和整个 UI 树。如果将宿主和插件放到不同的应用程序域中,则可以解决此问题。...
阅读(39) 评论(0)

Visual->UIElement->FrameworkElement,带来更多功能的同时也带来了更多的限制

我们总会自然而然地认为这些控件都是有大小的,它们会在合适的位置显示自己,通常不会超出去。但是,`FrameworkElement` 甚至是 `Control` 用得久了,都开始忘记 `Visual`、`UIElement` 带给我们的那些自由。...
阅读(40) 评论(0)

从 “x is null 和 x == null” 的区别看 C# 7 模式匹配中常量和 null 的匹配

尝试过写 if (x is null)?它与 if (x == null) 相比,孰优孰劣呢?x is null 还有 x is constant 是 C# 7.0 中引入的模式匹配(Pattern Matching)中的一个小细节。阅读本文将了解 x is constant 和 x == constant 之间的差别,并给出一些代码编写建议。...
阅读(60) 评论(0)

WPF 和 UWP 中,不用设置 From 或 To,Storyboard 即拥有更灵活的动画控制

无论是 WPF 还是 UWP 开发,如果用 Storyboard 和 Animation 做动画,我们多数时候都会设置 From 和 To 属性,用于从起始值动画到目标值。然而动画并不总是可以静态地指定这些值,因为更多的时候动画的起始值和目标值取决于当前 UI 的状态。本文中,我将将尽量避免设置 From 和 To 值,让动画可以随时中断并重新开始,而中途不会出现突兀的变化。...
阅读(364) 评论(0)

如何实现一个可以用 await 异步等待的 Awaiter

.NET 和 C# 共同给我们带来的 async/await 异步编程模型(TAP)用起来真的很爽。为了实现异步等待,我们只需要在一切能够能够异步等待的方法前面加上 await 即可。能够异步等待的最常见的类型莫过于 Task,但也有一些其他类型。即便有些耗时操作没有返回可等待的类型,我们也可以用一句 Task.Run(action) 来包装(同步转异步 - 林德熙 中也有说明);不过副作用就是 R...
阅读(2641) 评论(7)

使用 Task.Wait()?立刻死锁(deadlock)

最近读到一篇异步转同步的文章,发现其中没有考虑到异步转同步过程中发生的死锁问题,所以特地在本文说说异步转同步过程中的死锁问题。那篇文章的来源: - win10 uwp 异步转同步我已联系作者进行修改。什么情况下会产生死锁?调用 Task.Wait() 或者 Task.Result 立刻产生死锁的充分条件: 1. 调用 Wait() 或 Result 的代码位于 UI 线程; 1. Task 的...
阅读(970) 评论(0)

使用 ExceptionDispatchInfo 捕捉并重新抛出异常

当你跑起了一个异步线程,并用 await 异步等待时,有没有好奇为什么能够在主线程 catch 到异步线程的异常?当你希望在代码中提前收集好异常,最后一并把收集到的异常抛出的时候,能不能做到就像在原始异常发生的地方抛出一样?本文介绍 ExceptionDispatchInfo,专门用于重新抛出异常。它在 .NET Framework 4.5 中首次引入,并原生在 .NET Core 和 .NET S...
阅读(364) 评论(0)

如何防止后台线程抛出的异常让程序崩溃退出

如果你的程序抛了异常,你是怎么处理的呢?等待程序崩溃退出?还是进行补救?如果是做 UI 开发,很容易就找到 Dispatcher.UnhandledException 事件,然后在事件中进行补救。如果补救成功,可以设置 e.Handled = true 来阻止异常继续让程序崩溃退出。但是,如果是后台线程抛出了异常呢?并没有 Dispatcher 可以用。所以我们就束手就擒让程序自己退出吗?WPF 和...
阅读(470) 评论(0)

出让执行权:Task.Yield, Dispathcer.Yield

Yield 这个词很有意思,叫做“屈服”“放弃”“让步”,字面意义上是让出当前任务的执行权,转而让其他任务可以插入执行。Task、Dispatcher、Thread 都有 Yield() 方法,看起来都可以让出当前任务的执行权。如果在阅读中发现对本文涉及到的一些概念不太明白,可以阅读: 深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分) 深入了解 WPF...
阅读(413) 评论(0)

如何组织一个同时面向 UWP/WPF/.Net Core 控制台的 C# 项目解决方案

希望写一个小型工具,给自己和需要的人。考虑到代码尽可能的复用,我准备采用 .Net Standard 来编写大多数核心代码,并基于 .Net Core 编写跨平台控制台入口,用 WPF 编写桌面端 UI 入口,用 UWP 作为可上架商店的 UI 入口,然后用 Shared Project 共享 WPF 和 UI 的多数 UI 入口代码。阅读本文将了解到如何在尽可能复用代码的情况下组织这样的 C# 解...
阅读(527) 评论(0)

深入了解 WPF Dispatcher 的工作原理(PushFrame 部分)

在上一篇文章 深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分) 中我们发现 Dispatcher.Invoke 方法内部是靠 Dispatcher.PushFrame 来确保“不阻塞地等待”的。然而它是怎么做到“不阻塞地等待”的呢?...
阅读(2466) 评论(3)

深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分)

深耕 WPF 开发的各位程序员大大们一定避不开使用 Dispatcher。跨线程访问 UI 当然免不了用到它,将某个任务延迟到当前任务之后执行也会用到它。Dispatcher.Invoke、Dispatcher.BeginInvoke 是过去大家经常使用的方法,而 .Net Framework 4.5 中微软为我们带来了 Dispatcher.InvokeAsync 方法,它和前面两个有何不同?...
阅读(2265) 评论(2)

.Net Framework 4.x 程序到底运行在哪个 CLR 版本之上

当我们编译程序目标框架选为 .Net Framework 4.5/4.6/4.7 时,CLR 运行时是如何判断我们究竟应该用哪一个 .Net Framework 呢?.Net Framework 的版本到底由哪些部分组成?我们编译 .Net Framework 时选择的版本到底决定了什么?...
阅读(794) 评论(0)
    个人资料
    • 访问:16703次
    • 积分:468
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:0篇
    • 译文:0篇
    • 评论:12条
    文章分类
    文章存档