2008年1月25日

呵呵,其实好久就想写下这个主题,一个是对自己过去的一年的总结同时也是对自己在新的一年里的勉励吧。
其实07年对自己来说还是不平凡的一年。
1:首先是值得庆祝的是完成人生的一件大事:老婆帮我生了个儿子。呵呵。其实应该算老婆的功劳。不过对于我来说,也算是一件大事,毕竟好歹是一个爸爸了。呵呵,幸福感和责任感随着而来。在这里我要感谢我的老婆,老婆你幸苦了。
2:07年是我程序生涯的一次大事情,我从VB6.0转向了.net. 这要感谢公司给我这个机会,因为个人感觉从VB到.net的转变不是程序语言的转变。而是编程的思想的转变,从简单面向对象到完全面向对象,包括ASP.NET,C#的学习。当然,我要学的东西还是很多,面向对象的东西博大精深,比如说设计模式,ASP.NET的原理等等。很多东西都要去专研,只有将自己的水平提高了,还有很多东西我都还不是很懂。
3:07在被卖出的半年中,我比较好的完成了客户的要求,得到了客户和公司对自己的肯定。其实在这半年中,获取最多的还是学会做人和生活中的一些道理。我想这让我以后的工作和生活中将得到帮助。
4:07年里我也报了自考,算是我的自考年吧,呵呵,希望撒下自考的种子在今后的两到三年后能够修成正果。虽然很多朋友都劝我学那种远程教育,因为自考太难考了。其实通过今年报的三门中,我觉得自己还是学到了很多东西,因为自考里的很多东西都是我专业里的基础课程,都是讲一些很原理,很基础的知识,但是通过学习,觉得越是基础的东西对于自己的专业是非常重要的。比如说之前被外派时做的系统里面自己设计的数据结构让系统结构很清晰,代码也很清晰,更易读,而且效率也提高很多。接下来的操作系统和离散数学我相信会让我更加理解和学到更多东西。这让我更加坚定对自考的信心和勇气。
08年其实已经来到,其实在新年的来到时我自己心理油生了很多的理想,觉得自己需要做的东西很多,觉得时间不够。
1:首先是上面提到的自考和ASP原理的学习。因为3年的软件生涯让我明白引用其实很简单,但是只知道简单的应用是不够的。就如同理发师一样,我觉得理发师如果不懂的美学,不懂的如何去审美,不管这个理发师的理发技巧如何厉害,手法如何高明,我觉得他最多对一个发型是铭记在心的。他会将这个发型剪的非常的标准,但是这个理发师不知道怎样的人适合这个发型,可能这个人剪的很好,因为他很适合,但是换个人的话,却有可能不好看。其实是同一个道理,这个理发师不懂的美学,不知道怎么样才算美,虽然他掌握了某种方法的应用,但是他不知道为什么要用这个方法,什么时候改用这个方法。其实这些都是很原理东西。只有懂的原理的东西才可以创造更新的东西,才可以将不同的知识加以应用。
2:我想通过上面的学习,我将可以达到一个更高的层次。其实我的下个目标是做项目Manager,上面说的其实只是达到这个目标的一个必须阶段。当然,我还要开始学会这方面的东西。比如说管理,等等,我想经过在过两年之后,我将开始尝试这种工作了。
3:自考的任务还是很艰巨。在今年,我的目标是过7门。时间还是很紧迫,两年之后我在这加公司也待了4年了,由于外包公司的特殊性,结合自己个人的发展。如果要尝试做项目经理,可能只有另寻他路。所以两年之后,自考文凭必须拿到手。这样找工作也好找一点
4:其实以上两个第二和第三点是非常重要的。但是第一点也是很重要。如果第一点做好的话,在公司的待遇,在社会中的竞争也提高。
好了,暂时写到这里。08 年是让你很期待一年,奥运会,房产等都是很关键的一年。
好好把握自己,把握好每一天。


posted @ 2008-01-25 18:45 Farrell 阅读(53) 评论(0) 编辑
 
以前做web 程序的时候在.net环境下有时候是非常难将当前的excel或者word线程关闭,有时候在程序里面执行完excel关闭并且释放相关资源,但在服务器端的excel进程要等一会才能被关闭掉。如果用户在客户端平凡对excel操作(在很短的时间内),即使在程序里面控制了对excel组件的释放和回收,但是有可能服务器端有N个excel进程没有被关闭,造成服务器可能死掉。我相信有过对excel编程的朋友对关闭excel进程特别是在web 觉得是件很麻烦的事情。网上也有很多关闭excel的例子,但是发现N多是相互转载,都是用同一种办法,而且效果也不是很好。

这几天看到别人用System.Diagnostics.Process的时候想到了一个新方法。下面是我的具体做法:
1: 在打开或者新建excel,word的时候,先将当前进程里的word,excel进程的ID记录下来(这些有可能是属于用户已经打开的word或者excel进程,最后删除的时候这些进程是不能kill 掉的

//在打开excel前,将系统里面已经存在的excel进程进程ID保存起来
List<int> intList = new List<int>();

foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
    {
        if (p.ProcessName.ToUpper() == "EXCEL")
            {
                intList.Add(p.Id);
            }
    }

2: 我们的程序打开或者新建excel的操作,有可能还有其他的操作,我这里只简单的列出了基本操作。
Application app = new Application();
Workbook workbook = app.Workbooks.Open(FileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

Worksheet worksheet = (Worksheet)workbook.Worksheets[1];

workbook.Close(Type.Missing, Type.Missing, Type.Missing);
app.Quit();

3:关闭就是如何关闭刚才新建的excel进程

//先用系统提供的方法对系统资源释放,这种做法是大家常用的方法
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
GC.Collect();

//以下是我的新方法,如果还对象还没有释放的话kill 掉新线程
if (app!=null)
{

                foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
                {   
                    //先判断当前进程是否是excel                 
                    if (p.ProcessName.ToUpper() == "EXCEL")
                    {
                        //需要判断这个进程是用户打开的还是属于新建的进程,如果用户没有打开过excel,则直接kill掉这个进程
                        if (intList != null && intList.Count > 0)
                        {
                            //用来标志是否是程序新建的
                            bool bNewID=true;

                            foreach (int existId in intList)
                            {
                                if (existId == p.Id)
                                {
                                    bNewID = false;
                                    break;
                                }
                            }
                            //如果没有匹配到的话,说明是程序新建的,则删除他
                            if (bNewID == true)
                            {
                                p.Kill();
                            }
                        }
                        //用户都没有打开过excel进程,则直接kill掉他
                        else
                        {
                            p.Kill();
                        }
                    }
                }

}

以上方法就是我的方法。不过我个人觉得还有一点没有做好。 如果程序里面对excel操作的时间很长的话,那可能存在一点风险。因为程序很复杂造成对excel 操作很长时间的话,用户有可能在这段时间内又刚好打开了一个excel文件,这样程序在执行的时候有可能将用户这个进程也kill掉。所以以上我说的方法适合对excel操作时间比较短的情况.
看到这里你可能会说为什么不取新建时application的时候他的进程ID,操作完之后通过System.Diagnostics.Process.GetProcessById() 方法获取到这个Process,其实我开始也想通过这个方法来处理。无奈微软没有提供获取新建application的进程ID的方法。

希望以上方法对那些关闭excel进程头痛的朋友有帮助
如果大家觉得有更好的建议或者有新的方法麻烦告诉我,谢谢!以下是我的博客地址:http://farrell.cnblogs.com/








posted @ 2008-01-25 16:20 Farrell 阅读(1095) 评论(3) 编辑
 

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;

namespace SendEmailSpace
{
    /// <summary>
    /// iniClass 的摘要说明。
    /// </summary>
    // TODO: 在此处添加构造函数逻辑
    public class INIClass
    {
        public string inipath;
        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
        /// <summary>
        /// 构造方法
        /// </summary>
        /// <param name="INIPath">文件路径</param>
        public INIClass(string INIPath)
        {
            inipath = INIPath;
        }
        /// <summary>
        /// 写入INI文件
        /// </summary>
        /// <param name="Section">项目名称(如 [TypeName] )</param>
        /// <param name="Key">键</param>
        /// <param name="Value">值</param>
        public void IniWriteValue(string Section, string Key, string Value)
        {
            WritePrivateProfileString(Section, Key, Value, this.inipath);
        }
        /// <summary>
        /// 读出INI文件
        /// </summary>
        /// <param name="Section">项目名称(如 [TypeName] )</param>
        /// <param name="Key">键</param>
        public string IniReadValue(string Section, string Key)
        {
            StringBuilder temp = new StringBuilder(500);
            int i = GetPrivateProfileString(Section, Key, "", temp, 500, this.inipath);
            return temp.ToString();
        }
        /// <summary>
        /// 验证文件是否存在
        /// </summary>
        /// <returns>布尔值</returns>
        public bool ExistINIFile()
        {
            return File.Exists(inipath);
        }
    }

    //
}


 

posted @ 2008-01-25 09:51 Farrell 阅读(1407) 评论(1) 编辑
 
友情连接