2021-07-15 15:08:49
当你在一个Task执行中抛出异常,比如:Task.Factory.StartNew(() =>
{
throw new Exception();
});运行该方法,没有任何异常抛出。事实上此时Task的异常处于未觉察状态,这个未觉察状态的异常会在垃圾回收时终结器执行线程中被抛出。为了诱发这个异常,我们可以通过GC.Collect来强制垃圾回收从而引发终结器处理线程,此时Task...
2021-07-15 14:40:35
目录一、进程的概念与作用二、应用程序域三、深入了解.NET上下文四、进程应用程序域与线程的关系 四、进程、应用程序域、线程的相互关系4.1 跨AppDomain运行代码在应用程序域之间的数据是相对独立的,当需要在其他AppDomain当中执行当前 AppDomain中的程序集代码时,可以使用CrossAppDomainDelegate委托。把CrossAppDomainDelegate委托 绑定方...
2021-07-15 14:34:53
目录一、进程的概念与作用二、应用程序域三、深入了解.NET上下文四、进程应用程序域与线程的关系 三、深入了解.NET上下文3.1 .NET上下文的概念应用程序域是进程中承载程序集的逻辑分区,在应用程序域当中,存在更细粒度的用于承载.NET对象的实体,那就.NET上下文Context。所有的.NET对象都存在于上下文当中,每个AppDomain当中至少存在一个默认上下文(context 0)。一般不...
2021-07-15 14:30:57
目录一、进程的概念与作用二、应用程序域三、深入了解.NET上下文四、进程应用程序域与线程的关系 二、应用程序域使用.NET建立的可执行程序 *.exe,并没有直接承载到进程当中,而是承载到应用程序域(AppDomain)当中。应用程序域是.NET引入的一个新概念,它比进程所占用的资源要少,可以被看作是一个轻量级的进程。在一个进程中可以包含多个应用程序域,一个应用程序域可以装载一个可执行程序(*.e...
2021-07-15 14:24:53
引言本文主要是介绍进程(Process)、应用程序域(AppDomain)、.NET上下文(Context)的概念与操作。虽然在一般的开发当中这三者并不常用,但熟悉三者的关系,深入了解其作用,对提高系统的性能有莫大的帮助。在本篇最后的一节当中将会介绍到三者与线程之间的关系,希望对多线程开发人员能提供一定的帮助。因为时间仓促,文中有错误的地方敬请点评。目录一、进程的概念与作用二、应用程序域三、深入了...
2021-07-15 10:49:59
开发人员对Asnync 异步机制的兴趣程度很高。当然,任何新技术都必然会出现一些小问题。我现在多次看到的一个问题是开发人员通过阻止他们的 UI 线程意外地使他们的应用程序死锁,所以我认为花一些时间来探索这种情况的常见原因以及如何避免这种困境是值得的。就其核心而言,新的异步语言功能旨在恢复开发人员编写他们习惯编写的顺序、命令式代码的能力,但使其本质上是异步的而不是同步的。这意味着当操作以其他方式占用...
2021-07-15 10:41:14
在C#中我最喜欢的特性就是LINQ。使用LINQ, 我们可以获得一种易于编写和理解的简洁语法,而不是单调的foreach循环,它可以让你的代码更加美观。但是LINQ也有不好的地方,就是调试起来非常难。我们无法知道查询中到底发生了什么。我们可以看到输入值和输出值,但是仅此而已。当代码出现问题的时候,我们只能盯着代码看吗?答案是否定的,这里有几种可以使用的LINQ的调试方法。LINQ调试尽管很困难,但...
2021-07-15 08:44:58
今天勇哥又遇到这个问题。之前我在一篇贴子里谈过这个话题,见下面:关于VS2013或者VS2017打开工程时反复崩溃重启的问题 http://47.98.154.65/?id=403 主要原因其实是因为第三方用户自定义控件惹的祸。你可以回忆一下,自从加了哪个自定义控件后,出现了UI编辑器打开崩溃的问题。然后就去这个form的 Designes.cs文件里面把它注释掉,就可以了。接下来就是怎么样安...
2021-07-14 16:52:08
C#4.0的并行库TPL,即Task(一)http://47.98.154.65/?id=1793C#4.0的并行库TPL,即Task(二) http://47.98.154.65/?id=1798C#4.0的并行库TPL,即Task(三) http://47.98.154.65/?id=1808C#4.0的并行库TPL,即Task(四) http://47.98.154.65/?id=1815...
2021-07-13 11:48:15
节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing)。 内存映射文件对于托管世界的开发人员来说似乎很陌生,但它确实已经是很远古的技术了,而且在操作系统中地位相当。实际上,任何想要共享数据的通信模型都会在幕后使用它。 内存映射文件究竟是个什么?内存映射文件允许你保留一块地址空间,然后将该物理存储映射到这块内存空间中进行...
2021-07-12 20:30:39
勇哥继续谈一下异步中的任务取消机制CancellationToken和CancellationTokenSource。 之前做开发时,一直没注意这个东西,做了.net core之后,发现CancellationToken用的越来越平凡了。 这也难怪,原来.net framework使用异步的不是很多,而.net core首推异步编程,到处可以看到Task的影子,而CancellationTok...
2021-07-11 09:52:54
C# 外观模式(Facade)http://47.98.154.65/?id=1827 有关外观模式见下面贴子,下面是勇哥编写的一个例子。FundClass.csusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace facadeTest1
{...
2021-07-11 09:42:26
1. 外观模式简介 外观模式主要解决的问题:当有多个类要处理时,需要一个个类去调用,没有复用性和扩展性。外观模式将处理子类的过程封装成操作,简化客户端的调用过程。1.1 定义 外观模式(Facade)通过提供一个统一接口,来访问子系统的多个接口。 使用外观模式时,创建一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中方法。 外观模式让客户端与子系统...
2021-07-10 23:06:22
资源列表:业务逻辑BLLusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace student
{
public class StudentInstance
{
public DataChange onDataC...
2021-07-10 23:03:22
MVC模式主要解决的问题就是将表示层和业务层进行分离,在以往做WINFORM项目的时候,通常都是将很多的逻辑代码直接写在了Form.cs代码的事件里,这样的话业务逻辑就和界面紧耦合在一起了,现在我们采用MVC来解耦。首先建立Model:[csharp] view plain copy
using System;
using System.Collections.Generic;
us...
2021-07-10 08:37:21
前几天在用线程池执行一些任务时运到一种情形,就是回调方法中使用到了异步方法,但是回调方法貌似不支持async await的写法。这时候我应该如何处理呢?是使用Task.Result来获取返回结果,还是使用GetAwaiter.GetResult()呢?本文就来探讨下吧。这里先上我这种场景的伪代码:ThreadPool.QueueUserWorkItem(ExcuteScanProcess, nod...
2021-07-09 08:35:36
const、static、readonly 一直以来勇哥都没有完全搞明白其区别。正好手里有项目用到static readonly,因此仔细研究了一翻。记录如下:static readonly myclass1 c1 = new myclass1();这里的初始化在定义时初始化,如果放在其它位置则报错。const int myPI 跟常量是一样的,你可以必须使用常量的地方直接使用,比如下面的cas...
2021-07-08 20:09:22
1. 引言事件总线这个概念对你来说可能很陌生,但提到观察者(发布-订阅)模式,你也许就很熟悉。事件总线是对发布-订阅模式的一种实现。它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的。我们来看看事件总线的处理流程:了解了事件总线的基本概念和处理流程,下面我们就来分析下如何去实现事件总线。2.回归本质在动手实现事件总线之前,我们还是要追本溯源,探索一下事...
2021-07-08 17:21:58
委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observ...
2021-07-07 23:11:35
C#的事件、委托测试(一) http://47.98.154.65/?id=1853C#的事件、委托测试(二) http://47.98.154.65/?id=1854C#的事件、委托测试(三) http://47.98.154.65/?id=1820 来个例题。目标:在列表框选择要监控的线程,点start后开始监控。当这个线程结束了(比如那个记事本程序被我关闭了),弹出一个messageb...
2021-07-07 21:26:17
4个轴是25ping的接线端子,定义如下:如果你步进脉冲信号是5v的就这样接4根线就可以,固高卡里面把脉冲模式设置成脉冲+方向即可步进和伺服用法是一样的,只不过步进少了编码器反馈,还有一些其他功能,约等于简化版伺服下图仅供参考,步进品牌不一样接法不一样。--------------------- 作者:hackpig来源:www.skcircle.com版权声明:本文为博主原创文章,转载请附上博文...
2021-07-07 14:07:25
由于勇哥工作使用的是VS2015 C#,所以查了一下它的新特性。一、简介VS2015内置的C#版本为6.0,该版本提供了一些新的语法糖,这里仅列出个人感觉比较有用的几个新功能。二、几个很有用的新特性注意:这些新特性只能用于VS2015及更高版本,无法在VS2013、VS2010等低版本中使用。当然,如果你不喜欢这些新的特性,仍然可以继续使用原来的用法(所以说它是新的语法糖)。1、自动属性初始化的改...
2021-07-05 14:45:25
在开始了解上下文之前,先来复习下.NET的应用程序的逻辑结构。通常情况下,一个进程只能运行一个应用程序。但在.NET环境下,一个进程可以运行多个应用程序,而这里的应用程序则以应用程序域划分,同一个应用程序或者程序集可以加载到同一进程的不同应用程序域中去。上图中没有标识出的是线程,线程和应用程序域并不是简单的一对一,或者一对多的关系。在一个应用程序域中可以有几个线程存在,而一个线程也可以跨多个应用程...
2021-07-03 09:43:01
C#4.0的并行库TPL,即Task(一)http://47.98.154.65/?id=1793C#4.0的并行库TPL,即Task(二) http://47.98.154.65/?id=1798C#4.0的并行库TPL,即Task(三) http://47.98.154.65/?id=1808C#4.0的并行库TPL,即Task(四) http://47.98.154.65/?id=1815...
2021-07-02 13:57:14
C#4.0的并行库TPL,即Task(一)http://47.98.154.65/?id=1793C#4.0的并行库TPL,即Task(二) http://47.98.154.65/?id=1798C#4.0的并行库TPL,即Task(三) http://47.98.154.65/?id=1808C#4.0的并行库TPL,即Task(四) http://47.98.154.65/?id=1815...
2021-07-01 19:54:31
Task实现暂停、继续、结束。看到这个,有些童鞋可能会想到自动化设备上的“停止”,“开始”按钮。勇哥要说的是,Task的暂停继续只是对于task的调度流程来说的,至于task内部跑的轴的运动逻辑来说,你还得有另外的办法让它同步暂停继续。所以整机控制功能并不是靠线程的挂起与继续就那么容易实现的。代码:几点说明。你可以在return那里下断点,程序最后会取消task的执行,就断在这里了。因为这个是异步...
2021-07-01 17:16:34
全网的教程都是教你怎么用CancellationTokenSource.Token取消Task,就是不告诉你取消Task后,再次运行Task, 仍然是取消状态,Task跑不起来。而且你想找下Token有没有复位的方法,结果是没发现。其实,每次使用CancellationTokenSource.Token时都要new一个新的!勇哥实测是可以的,就这么简单!真不知道微软是怎么设计的?!--------...
2021-07-01 15:34:05
用下面的代码,会发生一个错误。报的错误是FlowItemListP[i]的索引超范围,FlowItemListP.Count的值是3, 但是FlowItemListP[i]居然索引值是3打死都想不到i怎么可能计数到3 for (int i = 0; i < FlowItemListP.Count; i++)
{
if (FlowItemListP[i].RunModeF ==...
2021-07-01 11:42:14
有时候,我们创建了多线程,需要知道是否都完成了各自的工作。比如说,开启了多线程的下载,如何终止所有的线程并且在确保所有线程都终止之后才继续执行程序的退出呢?public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent()...
2021-07-01 11:27:57
先说是一下 ManualResetEvent 是一线程用来控制别一个线程的信号。大家可以把它看成 操作系统原理中说到的pv操作如下图所说是 ManualResetEvent 对象起一个信使的作用。ManualResetEvent 对象的两个控制方法。1、this.manualEvent.Reset(); //将事件状态设置为非终止状态,导致线程阻止。2、this.manualEvent.Set()...