题记:

最近看了一篇关于架构方面的良心长文你的架构是怎样一步步腐化的?,文中字字句句道出了诸多从业者、初创企业,以及BAT都会遇到的问题,细细品读后认为工作生活中的诸多情况皆如此,都会有一个体量由小到大的增长过程,这就面临着怎样管理的问题。逐步优化 or 推倒重来

背景:

博客中的【日积(Running)月累(ZSSURE)】系列,用于记录平日里学习和工作中遇到的问题。然并不意味着每一个问题都是多大的“坑”。作为程序猿应该都有过这种体会,“调试了一整天程序,结果发现是某个变量名称写错了。亦或是其它种种低级而low的错误……”。所谓的成长有其广度的一面。那就是你要随时准备接受新技术、新技能;同一时候也有其深度的一面,那就是静静思考。

非常多看似简单的问题,求根溯源找到解决方式就是一种常见的思考方式,是锤炼深度的必由之路。

对于初入职场的新人,往往会因为接触了新的技能、熟悉了新的领域而兴奋不已,总希望可以学习新的东西,可以追随大牛or大神的脚步。

随着时间的流逝兴趣、热情逐渐消散,到头来却是“竹篮子打水”,一无所获。

今年日常事务繁多。发现写博的量有所下降,自己虽不追求量,但细细回忆2015,似乎没有多少的收获,这从一个側面说明了在熙熙攘攘、纷繁吵杂的工作和生活中留给自己静静思考的时间少了,对知识、技能深度的把握少了。作家格拉德威尔在《异类》一书中指出:“人们眼中的天才之所以卓越非凡,并不是天资超人一等,而是付出了持续不断的努力。1万小时的锤炼是不论什么人从平庸变成超凡的必要条件。”这也就是“一万小时定律”

细想一下,设:

每篇博文成文前思考整理时间是4(单位:小时),编写公布时间是2。那么,一万小时=10000/6=1667(篇)。依照平均每月4篇,须要34年(417个月)。还是蛮恐怖的一件事情,不是么?

问题&解决方式:

【问题1】 .NET中Task任务的取消

【问题描写叙述】:近日在监控基于WCF的DICOM服务模块时发现控制台总会莫名的多出一些线程(事实上是Task)占用系统资源,导致每隔一段时间须要重新启动服务才干彻底释放。

【问题根源】:通过调试跟踪。发如今响应不同用户需求时会出现中断之前需求的情况,然而此种情况下由被中断的操作所创建的Task任务却依旧在执行。

【解决方式】在Task任务内部使用CancellationTokenSource监控当前操作是否已被中断。

        private readonly CancellationTokenSource _cts = new CancellationTokenSource();
public CancellationTokenSource CannelToken
{
get { return _cts; }
}
private void StartSubTaskUntilCancel()
{
Task.Factory.StartNew(new Action(() =>
{
while (true)
{
_cts.Token.ThrowIfCancellationRequested();
Thread.Sleep(500);
System.Console.WriteLine(DateTime.Now.ToLongTimeString());
}
}));
}

关于Task任务的中断在WinForm界面开发中要额外注意,之前学习Task的用法时大多是在控制台下单独练习并未考虑到用户操作。以及WinForm中自身的消息循环机制。举例说明例如以下:



如上图所看到的,在主窗口“开启新窗口”button响应里,弹出子窗口TaskForm时启动了一个Task用于实时输出当前时间。

依照之前传统的思路,在TaskForm窗口中创建的Task在关闭窗口后会自己主动退出(这就是由控制台环境下练习导致的惯性思维)。

然而当我们关闭子窗口TaskForm时,会发现时间依旧在输出。那么怎样才干依据用户交互来是的Task适当退出呢?——就是上面提到的CancellationTokenSource

在子窗口的FormClosed事件响应中调用CancellationTokenSource的Cancel方法就可以通知Task退出。在分析Task以及线程池时可以使用Process Explorer的.NET Performance

详细细节可參考博文8天玩转并行开发——第二天 Task的使用C# CancellationTokenSource 终止线程

【问题2】Telerik OpenAccess的记录删除

【问题描写叙述】在使用Telerik OpenAccess来作为数据库操作中间件时,须要删除相关的记录,包含单条记录和多条记录。

【解决方式】直接使用OpenAccessContext的Delete方法就可以。详情參考How to: Delete Objects

【问题3】fo-dicom的DcmDataset的DeepCopy和ShallowCopy

【问题描写叙述】在使用fo-dicom作为自有数据格式与DICOM格式相互转换时,发现终于转换成的DICOM文件的部分字段同样。都等于最后一次转换时所赋的值。

【问题根源】这个问题应该是因为fo-dicom的C-STORE发送机制以及对象的浅拷贝造成的。关于fo-dicom的C-STORE的流程參见之前的博文DICOM:fo-dicom之C-STORE再分析‘解决System.ObjectDisposedException异常’,对于C-STORE服务一般是先将全部的数据统一加入到待发送队列中,然后调用send命令统一发送。因为每次转换数据时使用的DcmDataset是同一个对象,对于部分字段并没有逐个进行深度拷贝。因此会导致终于全部DICOM文件的部分字段一致。

【解决方式】使用DcmDataset的CopyTo函数就可以解决。

                            DicomDataset tmpDataset = new DicomDataset();
dataset.CopyTo(tmpDataset);

关于.NET的DeepCopy与ShallowCopy可參考博文Shallow Copy And Deep Copy

作者:zssure@163.com

时间:2016-01-16

日积(Running)月累(ZSSURE):Task之Cancel、OpenAccess之Delete及fo-dicom之DeepCopy、的更多相关文章

  1. grunt serve Warning: Running "sass:server" (sass) task

    使用grunt serve运行时遇到一问题: y@y:ydkt$ grunt serve Running "serve" task Running "clean:serv ...

  2. 【¥200代金券、iPad等您来拿】 阿里云9大产品免费公测#10月9日-11月6日#

    #10.09-11.06#200元代金券.iPad大奖, 9大产品评测活动! 亲爱的阿里云小伙伴们: 云产品的多样性(更多的云产品)也是让用户深度使用云计算的关键.今年阿里云产品线越来越丰富,小云搜罗 ...

  3. 一条SQL语句中算日销售额和月销售额

    刚刚做项目的时候用到的 用户表:用户ID,用户名,余额 流水表:时间,用户ID,用户名,类型(0充值,1消费),变更金额 现在要查每个用户的日销售额和月销售额,本来最简单的方法是先把所有用户查出来,然 ...

  4. 本周MySQL官方verified/open的bug列表(11月15日至11月21日)

    本周MySQL verified的bug列表(11月15日至11月21日) 1. Bug #70923    Replication failure on multi-statement INSERT ...

  5. 本周MySQL官方verified/open的bug列表(11月8日至11月14日)

    本周MySQL verified的bug列表(11月8日至11月14日) 1. Bug #70859-DWITH_EXAMPLE_STORAGE_ENGINE=1 is ignored     URL ...

  6. 本周MySQL官方verified的bug列表(11月1日至11月7日)

    本周MySQL verified的bug列表(11月1日至11月7日) 1.Bug #70839JSON_VALID allows to have two elements with the same ...

  7. 武汉Uber优步司机奖励政策(12月28日到1月3日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  8. 青岛Uber优步司机奖励政策(12月28日到1月3日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  9. 南京Uber优步司机奖励政策(12月28日到1月3日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

随机推荐

  1. POJ 3114 Tarjan+Dijkstra

    题意: 间谍在战争期间想要传递一份谍报回国,谍报可以在邮局之间传递,但这种传递是单向的,并且会少耗一些时间.但是如果两个邮局在同一个国家的话,那么谍报在这两个邮局之间传递是不消耗时间的.如果几个邮局发 ...

  2. Selenium获取input值的两种方法:WebElement.getAttribute("value")和WebElement.getText()

    在页面元素的定位中,有时候需要获取到元素的页面显示值,用来作为断言.例如,我需要获取email的值"amy1111@xxx.com". <input class=" ...

  3. windows 装XP系统

    笔记本型号:HPCQ40-506AX 1.在BIOS中更改启动顺序:将USB设为第一启动项2.插入装有PE系统的USB设备3.开机后一直按F124.到达选择系统界面,目前我的HPCQ40用其他系统进去 ...

  4. Laravel5.1学习笔记7 视图

    视图 (View) 基本用法 传递数据到视图 在多个视图中分享数据 视图组件   #基本用法 视图里面包含了你应用程序所提供的 HTML 代码,并且提供一个简单的方式来分离控制器和网页呈现上的逻辑.视 ...

  5. Visual C++6.0的下载与安装

    1.Visual C++6.0的下载 本书中使用的Visual C++6.0的中文版,读者可以在网上搜索,下载合适的安装包. 2.Visual C++6.0的安装 Visual C++6.0的具体安装 ...

  6. 修改withdraw 方法

    修改withdraw 方法 练习目标-使用有返回值的方法:在本练习里,将修改withdraw方法以返回一个布尔值来指示交易是否成功. 任务 1. 修改Account类 修改deposit 方法返回tr ...

  7. C# FormClosing FormClosed 区别详解

    FormClosing事件 在窗体关闭时,FormClosing事件发生.此事件会得到处理.从而释放与窗体相关的所有资源. 如果取消此事件,则窗体仍然保持打开状态. 当窗体显示为模式对话框时,单击“关 ...

  8. Deutsch lernen (04)

    1. streng a. 严厉的,严格的 streng gegen sich selbst und gegen andere sein streng auf Ordnung halten 2. ver ...

  9. jQuery中容易让人困惑的东西

    前言:jqueryt很灵活,太灵活了,可以说是他一个优点,也是他一个缺点,达到一种效果,十个人也许会用十种不同的方法来实现这个过程,结果一样,过程不一样,这到底是好,还是坏呢. 一,什么是jquery ...

  10. 人脸检测的harr检测函数

    眼球追踪需要对人脸进行识别,然后再对人眼进行识别,判断人眼张合度,进而判断疲劳... 解析:人脸检测的harr检测函数使用方法 代码理解: 利用训练集,检测出脸部,画出框 void CAviTestD ...