题记:

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

    1. 551. Student Attendance Record I 2. 552. Student Attendance Record II hihocode原题,https://hihocode ...

  2. java 微信api开发

    最近使用了一个很好的微信api框架,比较好使. 源码地址:https://github.com/chanjarster/weixin-java-tools/wiki 微信公众平台:微信公众平台开发文档 ...

  3. 消除svn选定(checkout)桌面上文件显示一大堆问号。

    图片: 解决方法一: 桌面右键选择TortoiseSVN——>点击Settings,如下图,选中Icon Overlays(图标覆盖),去勾选Fixed drives(本地磁盘),点击确定,按F ...

  4. HTML简单入门

    - Java攻城狮学习路线 - 基本结构 标准文档:www.w3.org <!DOCTYPE html> <html> <head> <meta charse ...

  5. dubbo之回声测试

    回声测试 回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控. 所有服务自动实现 EchoService 接口,只需将任意服务引用强制转型为 EchoSe ...

  6. (转)C#开发微信门户及应用(1)--开始使用微信接口

    http://www.cnblogs.com/wuhuacong/p/3613826.html 微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习 ...

  7. extension Array where Element 代码学习

    var fieldNames: [String] { let p = UnsafePointer<Int32>(self.pointer) return Array(utf8Strings ...

  8. Spring+SprinMVC配置学习总结

    一千个人有一千种spring的配置方式,真是这样.看了好多的配置,试验了很多.这里做一个总结. 1 原理上,spring和springmvc可以合并为一个配置文件然后在web.xml中加载,因为最终的 ...

  9. Tomcat 服务器中jsp页面乱码

    <Connector port="80" protocol="HTTP/1.1"               connectionTimeout=&quo ...

  10. javaee utf-8文件的转换

    package Zy; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.Fil ...