日期:2014-05-18  浏览次数:20529 次

Asp.net向word插入数据,始终有一winword.exe这个进程杀不了!
private   void   Button1_Click(object   sender,   System.EventArgs   e)
{

DataTable   dt1   =   new   DataTable();
DataRow   dr1   ;
dt1.Columns.Add( "name ",typeof(string));
dt1.Columns.Add( "no ",typeof(string));
dt1.Columns.Add( "mark ",typeof(string));

dr1   =   dt1.NewRow();
dr1[ "name "]= "张浩 ";
dr1[ "no "]= "10 ";
dr1[ "mark "]= "无 ";
dt1.Rows.Add(dr1);

Word.ApplicationClass   wordApp     =   null;
    try
    {
          wordApp     =   new   Word.ApplicationClass();

//定义一个模板的名称
          object   tempName   =   Server.MapPath( ". ")+   "\\22.doc ";
...代码省略
          try
            {代码省略...}
          fially
          {
              if(MyDoc   !=   null)
{
                    //   关闭,释放
    MyDoc.Close(ref   missing,   ref   missing,   ref   missing);
    MyDoc   =   null;
}
            }
}
finally
{
//   关闭,释放
    if(wordApp   !=   null)
    {
          wordApp.Quit(ref   missing,   ref   missing,   ref   missing);
          wordApp   =   null;
    }

}
}
以上是我程序的大致代码,当我开始单步执行的时候,执行第一个try中的       wordApp     =   new   Word.ApplicationClass();的时候,就不执行object   tempName   =   Server.MapPath( ". ")+   "\\22.doc ";这行,就直接跳到最后一个finally去执行了,当发现执行不了的时候,又跳到Word.ApplicationClass   wordApp     =   null;这里开始执行,这个时候,就能一步一步的执行下去了,直到最后把新的.doc的文件产生。这个时候,我打开任务管理器,发现有个winword.exe的进程没有结束掉。但是,我把这个程序发给别的同事调试是一点问题没有,没有出现有winword.exe的进程的。我也不知道什么原因,反正是郁闷的。如果放在服务器上去跑的话,那服务器要崩的,还请高手指导一下,到底我什么地方出了问题,或者环境还需配置什么么?谢谢!
                                           


------解决方案--------------------
Process[] myProcess = Process.GetProcessesByName( "WORD ");
foreach (Process process in myProcess)
{
try
{
process.Kill();
}
catch
{ }
}
------解决方案--------------------
这是微软的一个bug,其实就是com组件的内存泄漏问题,微软有专门的解决方案的。
System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp );

------解决方案--------------------
owc组件对象不能回收的问题,已经碰到过很多次了。这个问题去google或微软的官网上都有的。
------解决方案--------------------
跟操作系统也有关系的,我们的情况是2003下可以正常回收,xp下就留下很多excel进程。