一个关于c#操纵word进程的问题,难,请高手帮忙一个ASP.net应用程序,现在并发200用户同时访问服务器,请求系统某一功能,功能描述:把某一web页面内容,输出生成到一个word文件中。当系统只有一个人访问的时候,请求系统这一功能,没有问题,打开服务器任务管理器,能看到有一个winword.exe进程(我的系统是WIN2003)。但是,当系统并发200或更多用户的时候,瞬间,服务器任务管理器,就会出现200个或更多word进程,就是一个用户请求产生一个word进程,这个时候,服务器cpu\内存资源,就会被耗尽。虽然,我在生成WORD文件后,立即关闭该WORD进程,但是,那个瞬间,服务器资源耗尽会产生堵塞,服务器无法处理其他事情,这样很容易崩溃的。
已经听人说:先判断系统进程有没有WORD进程,如果有,当用户来生成WORD的时候,就不重新开WORD进程,即使200个用户并发也没事,都直接用这个进程。如果没WORD进程,当有用户来生成WORD,就开一个WORD进程来使用,后面再来的用户或更多并发用户,也都使用这个新开的进程。
我现在的问题就是:先判断系统进程里有没有WORD进程,或关闭它,这个用C#实现,比较简单的。可是,当我知道系统进程里已经有WORD进程,当有用户来请求生成WORD功能的时候,我就不需要重新开进程了,那么我怎么利用这个,系统已有的WORD进程了,怎么操作它,来实现这个生成WORD的功能了?(听说,用WORD句柄什么的,可以操纵,可是我不会WINDOWS编程,请大家帮忙,在C#里怎么实现)请高手指点一下,万分感谢!!!
已经听人说:先判断系统进程有没有WORD进程,如果有,当用户来生成WORD的时候,就不重新开WORD进程,即使200个用户并发也没事,都直接用这个进程。如果没WORD进程,当有用户来生成WORD,就开一个WORD进程来使用,后面再来的用户或更多并发用户,也都使用这个新开的进程。
我现在的问题就是:先判断系统进程里有没有WORD进程,或关闭它,这个用C#实现,比较简单的。可是,当我知道系统进程里已经有WORD进程,当有用户来请求生成WORD功能的时候,我就不需要重新开进程了,那么我怎么利用这个,系统已有的WORD进程了,怎么操作它,来实现这个生成WORD的功能了?(听说,用WORD句柄什么的,可以操纵,可是我不会WINDOWS编程,请大家帮忙,在C#里怎么实现)请高手指点一下,万分感谢!!!
try
{
ap =(Microsoft.Office.Interop.Excel.Application)
Microsoft.VisualBasic.Interaction.GetObject(null, "Excel.Application");
}
catch
{
ap = new Microsoft.Office.Interop.Excel.Application();
}
打开Word是一样的,只不过它的COM注册类型是 Word.Application。至于使用 Quit() 关闭的时候,Task Manager中仍然能够看到有至少一个进程,这是正常的,过去的进程外服务器系统就是这样设计的!否则当初也不会对COM进程外服务器提供 GetObject 和 CreateObject 两套方法。
——————————————————————————————————————————
那么谁是服务器呢?为什么要自己写一个服务器程序来再次引用OLE进程外服务,而不是直接在应用程序中使用已经写好的OLE服务?自己写服务是否就能让所有今后的应用都使用它从而取代已经有的OLE进程外服务?这样的解决方案是比一条 GetObject 命令更简单了还是更加清晰了?
我测试了,用了你这段程序可还是,每新增一个用户操作生成WORD,就新一个WORD建进程,任务管理器里Microsoft.Office.Interop.Excel.Application ap;
try
{
ap =(Microsoft.Office.Interop.Excel.Application)
Microsoft.VisualBasic.Interaction.GetObject(null, "Excel.Application");
}
catch
{
ap = new Microsoft.Office.Interop.Excel.Application();
}我的操作系统是WIN2003/vs.net2003
下面就是:Microsoft.Office.Interop.Excel.ApplicationClass ap;
try
{
ap =(Microsoft.Office.Interop.Word.ApplicationClass)
Microsoft.VisualBasic.Interaction.GetObject(null, "Excel.Application");
}
catch
{
//ap = new Microsoft.Office.Interop.Word.ApplicationClass();
}
请指点,谢谢你了
try
{
ap =(Microsoft.Office.Interop.Word.ApplicationClass)
Microsoft.VisualBasic.Interaction.GetObject("", "Word.Application");
}
catch
{
//ap = new Microsoft.Office.Interop.Word.ApplicationClass();
} 上贴写错了,不好意思
//try
//{
ap =(Microsoft.Office.Interop.Word.ApplicationClass)
Microsoft.VisualBasic.Interaction.GetObject("", "Word.Application");
//}
//catch
//{
// ap = new Microsoft.Office.Interop.Word.ApplicationClass();
//}这样看看到底一返回什么异常。
(Microsoft.Office.Interop.Word.ApplicationClass)
Microsoft.VisualBasic.Interaction.GetObject("", "Word.Application");