c# 多线程编程 <转>

05月 22nd, 2009

一.多线程的概念

Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程。什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。浏览器就是一个很好的多线程的例子,在浏览器中你可以在下载JAVA小应用程序或图象的同时滚动页面,在访问新页面时,播放动画和声音,打印文件等。

多线程的好处在于可以提高CPU的利用率——任何一个程序员都不希望自己的程序很多时候没事可干,在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。

然而我们也必须认识到线程本身可能影响系统性能的不利方面,以正确使用线程:

线程也是程序,所以线程需要占用内存,线程越多占用内存也越多
多线程需要协调和管理,所以需要CPU时间跟踪线程
线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题
线程太多会导致控制太复杂,最终可能造成很多Bug Read more »

入室抢劫

05月 17th, 2009

在美国,每个15秒钟就有人举报一起入室行窃案,统计数据显示,去年窃贼逛够了两百多万户人家。人们实际上几乎无法将蓄意行窃的盗贼拒之门外,所以做得只是设法拦截他片刻,从而使其暴露在巡警或者附近溜达的人们面前。常识告诉我们,光照是犯罪行为的障碍物。家门口必须安装一盏灯,并在晚上开着。不管是否相信,有些人,尤其是最晚进家的孩子,晚上进屋后不把门锁上。空心门,即便是锁上了,也容易遭贼入侵。因此最好选择实心门或者铁门,因为窃贼很难将它们撬开。如果你有意购买报警装置,别忘了索要报警器的标志,并把它们贴在窗户和门上。最后,提醒一句,外出旅游时,一定要请一位信得过的邻居,再你回来前,收好每日的报纸和邮件。这是因为放在门阶上或邮箱里成堆的报纸邮件如同广告一样让大家都知道你家里没人。

Read more »

进入ASP.NET的学习领域

05月 17th, 2009

最近一周进入了ASP.NET的学习中,把《visual studio 2005从入门到精通》看了个大概,也没明白个究竟,看来这本书还就是让你会操作visual studio的,而不是讲知识的。不过发现自己在接触新的东西的时候,往往在没有老师的指点下,一般都是撞得“头破血流”之后自己才有了如梦初醒的感觉。之后老师在那么一讲解,就有醍醐灌顶的感觉了。最近一周的生活有点混乱,每天都到晚上3点钟才睡着。早上的时间基本上就没办法利用。

我的英语啊,要考四级呀。英语还是要背诵的,必须抽出时间读英语。这是必要的。不然四级铁定考不过,以后再看个英文的技术文章,就不用每每的拿着个词典在那查啊查的了。在博客里面新开个英语的栏目,把我背诵过得,写过的文章发一下,惊醒一下自己吧。

c#的所涉及的范畴,学了已经多过半个学期了。有了一个大概。如果现在让我做一个winform我想,我自己肯定做不出来,现在心里对winform也没有很清晰的轮廓。就凭课本那本书还远远的不够,多看书,看经典教材。争取自己做一个桌面程序出来,自己看看。心里也有个底。还是要理解面向对象。深入的理解。

哎,学习的过程总是这样子

05月 2nd, 2009

好久没有认真的写过代码了,这个学期本来也是刚开始学习c#,今天做了个MDI窗体的记事本,费劲脑子,最终有个问题还是没有解决,感觉自己还是不能从总体上把握面向对象,用空间用的多了,就不知道该怎么手写函数了。抄别人的代码抄的多了,就不会自己写代码了。一帆风顺的学习过程是不会有结果的。尤其是向我们这样的学科,重在实践,实践中出真知。要努力实践,努力接受实践中所所遇到的问题,可能问题把脑子想破也有时候也不会,原因不是自己不会,是自己还没有学习那么深。可是自己学了那么深的时候就会解决这个问题了吗?不见得,问题来的时候,会让自己的心情有所沮丧,可是回头来还是要面对,作业还是要完成,任务还是要完成,要保持一颗平和的心去理解。

在学习c#的过程中,感觉最难受的就是没有一个好的同伴可以一同学习,没有一个好的老师可以指点迷津,老师都太忙,老师也太远。哎,如果可以有一个有经验的人带一带,我想我一定可以突飞猛进的。

ADO.NET类介绍(原创)

04月 10th, 2009

.NET Framework数据提供程序用于连接数据库,执行命令和检索结果,使得可以直接处理检索到的结果,或将其放入ADO.NET的DataSet对象中,以便与来自多个源的数据或在层之间进行远程处理的数据组合在一起,以特殊身份为用户提供。
ADO.NET支持的数据访问方式及其命名空间。

Read more »

实现遍历目录的递归算法(c#实现)

04月 9th, 2009

无需过多的解释了,好代码,理解清楚就ok了。

 public void PopulateTreeView(string directoryValue, TreeNode parentNode)
        {
            string[] directoryArray = Directory.GetDirectories(directoryValue);
            try
            {
                if (directoryArray.Length != 0)
                {
                    foreach (string directory in directoryArray)
                    {
                        substringDirectory = 
directory.Substring(directory.LastIndexOf('\\') + 1, 
directory.Length - directory.LastIndexOf('\\') - 1);
                        TreeNode myNode = new TreeNode(substringDirectory);
                        parentNode.Nodes.Add(myNode);
                        PopulateTreeView(directory, myNode);
                    }
                }
            }
            catch (UnauthorizedAccessException)
            {
                parentNode.Nodes.Add("Access denied");
            }
        }

关于懒惰,关于过去

04月 1st, 2009

懒惰会给我们带来些什么,今天,自己很颓的过完了。上完《概率论》后,做作业的时候才发现。自己不会做。无奈,把《高数》,《概率论》这两本书都拿了出来。这清明放假前,把《高数》课本在看一遍。提起《高数》,我想起了我前段时间提醒自己要把《C语言》在温习一遍,可现在发现自己早已忘到九霄云外了。

上周因为要参加数据库的三级考试,所以把《数据库原理》给复习了一遍,大致的过了一遍,没有很仔细的,过后发现自己收益还是颇多的。这让我想到,曾经在班会上,我说的一句话

“一本书要至少看三遍”。来到大学已经快两年了。我们学了多少东西,真正写过的C语言的代码有多少,那我自己来说,自己设计并思考的,独立完成的C语言大致估算只有1000行左右。主要完成的还是大一的时候的课程设计,还有在参加挑战杯前期自己写过的一些尝试性的实现图片类型转换的小程序。这个学期学习的《数据结构》是一把利器,是能够让我们如虎添翼的东西,可是,它真的是块硬石头,难啃的很,这本书我们要读几遍,至少这第一遍,都还没有读完!

谈起懒惰,我自己是真懒,爸爸说我懒,一点没错。时常想起老爸的这句话,可是却又时常的忘记。懒,给我们带来的是什么,仔细想想,很多,很多。让我们做事情半途而废,做事情的半途而废让我们无法形成一种坚毅的性格,一种软弱的性格让我们做任何事情都先考虑到它的困难,当我们考虑到它的困难的时候,往往带来是消极,悲观。自此,我们的人性中,显现的第一个形容词是negative。自此永远的成为一个普通人,人生自此生活在压抑中,自此生活在失败中。oh,my god!这将是多么令人恐怖的一件事情。

自己总是有很多的想法,可是真正实现了吗???就像高需老师说的那句话:“提出问题和解决问题哪个更重要呢?”,当时我就感觉是解决问题更重要!

oh,想起来,昨天晚上写得c#代码还是个半截子扔在那里——实现的一个能够一次输入多个操作符的通过winform计算器,还是半拉子里。好,继续干!让自己不成为那样一个让我感到恐怖的人。

C语言–栈要点总结,顺序栈的实现

03月 22nd, 2009

上周学习的数据结构中关于栈,有下面几点,我感觉引起我的重视。

  • 栈的基本操作中,基本上都是在栈顶进行的。比如在栈顶的插入,删除,栈的初始化,栈的判空(S.base == S.top),取栈顶元素等等。所以关于top指针要引起足够的重视和理解。
  • 理解栈和基本线性表的之间的关系。首先,栈就是线性表,栈是一种操作受限的线性表。可以想想就是带着镣铐跳舞的感觉,所以实现的时候必须严格按照栈的定义来执行栈的操作。
  • 栈不存在的条件:base = null;
  • 栈为空的条件:base = top;
  • 栈满的条件:top  – base = stacksize;

Read more »

(转)c#中委托与事件

03月 21st, 2009

最近在博客园中看到的一篇好文章,也是唯一让我从委托和事件的迷魂阵中绕出来的好文章,推荐一下–http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html

引言

委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。

Read more »