kongxx's blog

有困难要上,没有困难创造困难也要上!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
最近在做一个简单的屏幕保护程序,功能很简单就是在机器长时间不用的情况下,间隔一定时间启动一个屏幕保护程序。我这里有个特殊情况就是要播放一些媒体文件(.avi,.wmv)和flash文件等,因此我使用的是windows自带的WindowsMediaPlayer来做播放器。
由于一些特殊原因,我需要在一个没有GUI的程序中启动屏幕保护程序,因此最初使用的是System.Threading.Timer来做定时器的,但是在测试中发现总是出席以下异常:
Message: 因为当前线程不在单线程单元中,故无法实例化 ActiveX 控件“6bf52a52-394a-11d3-b153-00c04f79faa6”。
Source: System.Windows.Forms
   at System.Windows.Forms.AxHost..ctor(String clsid, Int32 flags)
   at System.Windows.Forms.AxHost..ctor(String clsid)
   at AxWMPLib.AxWindowsMediaPlayer..ctor()
   ...
后来弄了好长时间才发现,原来WindowsMediaPlayer控件只能在单线程环境下才可以运行,后来将我的Timer改成System.Windows.Forms.Timer对象,再进行测试,一切OK!
总结:通过这次错误发现自己在写一些程序的时候没有很好的阅读MS的开发文档,主要是没有关注线程安全方面的东西,下次开发中需要特别提出注意.