Main | January 2004 »

December 26, 2003

从timer看一眼.net的编译机制

    因为工作需要,制作了一个定时发送数据的windows service,C#开发。其中碰上了一个很有意思的问题。


 


先看看程序大概的结构:


 


初始化


              private void InitializeComponent()

              {

                     this.timer1 = new Timer();

                     this.timer1.Elapsed += new ElapsedEventHandler(timer1_Tick);

              }

       serviceonStart() 

protected override void OnStart(string[] args)

              {

                     timer1.Interval = 6000;

                     timer1.Start();

                     EventLog.WriteEntry(ServiceName +"Event","timer started 1");

              }

定时器触发

              private void timer1_Tick(Object source, ElapsedEventArgs e)

              {

                     DateTime time = DateTime.Now;

                     TimeSpan dayspan=new  TimeSpan(1,0,0,0);

                     time=time.Subtract(dayspan);

                     DateTime dateTime1=new DateTime(time.Year,time.Month,time.Day,0,0,0);

                     DateTime dateTime2=new DateTime(time.Year,time.Month,time.Day,23,59,59);

                    

                     if (time.Hour==8&&time.Minute==30&&lastupdate.Day!=DateTime.Now.Day)

                     {

                           

try


                           
{


                                  
PSOInterfaceWraper PsoWraper = new PSOInterfaceWraper();


                                  
PSOInterfaceWraper.GeneralLedgerAsyncResult Result;


 


                                  
DateTime StartDate=dateTime1;


                                  
DateTime EndDate=dateTime2;

                                   int amount=LedgerAsyncBLL(StartDate,EndDate);

                                   Result = PsoWraper.GeneralLedgerAsync("00",StartDate,EndDate,this.TranslationCount,amount*100);               

                           

                                   EventLog.WriteEntry(ServiceName +" Vnet","Result:"+ Result.Result+"  "+Result.ErrorDescription+"Count:"+this.TranslationCount.ToString()+"---Amount:"+(amount*100).ToString()+"  date:"+StartDate.ToString()+"~"+EndDate.ToString());

                                   if (Result.Result==0)

                                          lastupdate= DateTime.Now;

                            }

                            catch (Exception err)

                            {

                                   EventLog.WriteEntry(ServiceName +" Vnet","Error:"+"  "+err.Message);

                            }

                     }

              }

             

实际运行中发现,       EventLog.WriteEntry(ServiceName +"Event","timer started 1"); 运行正确,但是timer1_Tick中的代码并没有运行。

后来分析发现,工程的Refences中引用了VNetPSO.dll,但是没有把相应的文件copy,到相应目录。也就是说,运行时找不到此文件。

观察代码可知,引用VNetPSO.dll部分的代码只存在于timer1_Tick中。复制VNetPSO.dll到正确位置,问题排除。

由此发现.net所谓即时编译的一些特性。

InitializeComponent()中,可看到this.timer1.Elapsed += new  lapsedEventHandler(timer1_Tick);按照.net的即时编译的思路,开始认为这段代码会导致timer1_Tick被编译。但是如果是这样的顺序,在InitializeComponent中就会出现错误,导致程序不能正常运行。_那么OnStartEventLog.WriteEntry(ServiceName +"Event","timer started 1");

也就不可能运行了。

     所以,timer1_Tick实际是在Timer第一次触发的时候才被编译的。上面程序的例子中,就是在timer1启动了6秒之后。这时候发现VNetPSO.dll不存在,故此这部分代码被编译器忽略。也就造成了最开始出现的情况。

当然,前面只是一些推测,并没有方法能得到可靠的验证。但是,我认为推测应该基本合理。

至少,可以推测这么几个事实:

1 .net中的代码只有实际用到才会编译,除非强制进行预编译。

2 由于以上机制定时器变得更加不可靠,因为在定时器第一次触发的瞬间会导致编译,对于要求时间很高的程序可能会导致错过第一次执行的时间。

December 17, 2003

今天作了什么?

用C#写了一个windows service,用来作和互连星空之间的对帐。

比以前手工操作好多了。

.net写windows service真是太简单了,想想过去,简直不堪回首...不过人真是越来越懒了。

现在凭一个人做的小东西几乎无法判断水平了。.net的门槛太低了。哎...

December 11, 2003

北方的涮肉

把火锅作为这种食品的代称,大约是从川菜大举进攻开始的。按照儿时依稀的记忆,京津两地把这种吃法叫做涮肉,用来涮肉的容器是那种烧炭,中间肚大,四周是汤的那种黄铜或是紫铜制的火锅。
涮肉主料基本是羊肉,而且最好吃的是手切羊肉,肉片大而且稍显厚。配料是麻酱,韭菜花,腐乳等混合起来的,喜欢吃辣的当然可以加些辣椒油。香油料是近年才有的,应该也是随着重庆火锅传来的。
除了肉,粉丝,白菜,豆腐是必不可少的。主食一般是烧饼(火烧?),而不是现在常吃的杂面。
吃的时节大多在冬天,天气比较冷,一家人围着炭锅自得其乐。
火烧起来,汤很快就会沸腾,夹起肉放进锅里,在汤中翻滚翻滚几下即可沾麻酱料开吃。北方是不用辣汤的,所以味道的好坏和肉质关系极大。沾了料的肉味鲜美,除了小料中的辣椒油便再无辣味,没有任何刺激,吃起来并不需要什么勇气,但肉味总是鲜美的。
北方的冬天冗长而难熬,对小孩子尤其如此,所以火锅也算难得的令人不得不爱的东西。虽然简单,品种单一,但是当年看来绝对是难得的美食。如今我已经变得颇有几分嗜辣如命,无辣不成席,但吃涮肉的时候还是老老实实的放一点点辣椒油。这才是正经的北方风味。平和,淡泊,就算有一点点刺激,来的也不突兀,随便谁都能享用。可能不会上瘾,但是也很难抵触。也许,这是所有北方菜的特点吧--平淡,简单。
火锅像人的性格,这句话想来确实没错。

December 9, 2003

好多年不熬夜了--这个原来应该写在这里。

原来应该写在这里,这还是上周的,但是添加到文章里面了,所以首页看不到更新。重新来过。没想到这又是个错误..........

---------原文----------

没想到这个blog的开篇竟然是从这个错误开始。

公司网站上新系统,虽然还有很多问题,毕竟也是3个月的成果。

可惜,昨天下班的时候突然发现数据库倒的有问题。虽然也有其他部门改来改去的问题,不过大部分还是因为我的错误所致。只好重新倒,整整花了一夜时间....

说起来很久没熬夜了。颇有些不适应。睡了一上午,去上班,还是觉得晕头转向。看来也算有几分老了,去年的时候还偶尔通宵,也没有这么难受。 回想起大一时候通宵打游戏的日子,当时是无比的精神和兴奋,有时候通宵之后还继续去上课,而且还是高数,转眼之间,上班也已经一年了。

(胡乱发了些感叹,不过本栏目本来就是胡言乱语,呵呵。)

算了,还是提醒自己,不要再犯这么愚蠢的错误......顺便,明天新系统正式上线,先预祝成功!!

about me:
me.jpg
CC License. Some rights reserved.
署名·非商业用途·保持一致
本站之所有未作特别说明的内容均使用 创作共用协议.
POWERED_BY_MT_3.2