题记:

最近看了一篇关于架构方面的良心长文你的架构是怎样一步步腐化的?,文中字字句句道出了诸多从业者、初创企业,以及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. window.dialogArguments

    弹出子窗口window.showModalDialog( url, window ); 然后在弹出的子窗口中: window.dialogArguments 即为父窗口window对象的引用.想搞什么 ...

  2. vue axios 请求带token设置

    API axios.js import axios from "axios"; let AUTH_TOKEN=(function(){ return localStorage.ge ...

  3. 几段Python小程序

    程序片段1 第一个需求是需要生成一些随机的时间,例如需要随机生成从一年前到现在的一些时间,刚开始折腾了半天,最后的代码如下: from datetime import timedelta from d ...

  4. Eclipse之调试代码和返回

    编写代码时,经常会遇到各种莫名其妙的问题,为了检测程序是哪里出现问题,我们通过断点调试来判断哪一步出错 一.断点 在需要断点的地方,在左侧双击鼠标设置断点,可设置多个 去掉断点:在断点上双击一下,没有 ...

  5. OpenCV边缘检测的详细参数调节

    1. findCountours 转载于http://blog.sina.com.cn/s/blog_7155fb1a0101a90h.html findContours函数,这个函数的原型为: &l ...

  6. 读书笔记「Python编程:从入门到实践」_5.if语句

    5.1 一个简单示例 cars = ['audi', 'bmw', 'subaru', 'toyota'] for car in cars: if car == 'bmw': print(car.up ...

  7. python 生成测试报告并发送邮件

    前言: 使用unittest编写自动化测试脚本,执行脚本后可以很方便看到测试用例的执行情况. 但如果想向领导汇报工作,就需要提供更直观的测试报告. 思路: 使用unittest编写测试用例,HTMLT ...

  8. python自动发邮件库yagmail(转)

    一般发邮件方法 我以前在通过Python实现自动化邮件功能的时候是这样的: import smtplib from email.mime.text import MIMEText from email ...

  9. xml方式实现aop编程

    第一:引入jai文件 第二:引入aop名称空间 第三:配置aop

  10. BPM结束任务

    var pi = tw.system.findProcessInstanceByID("158");for(var i=0; i<pi.tasks.length; i++) ...