一个关于c#操纵word进程的问题,难,请高手帮忙

ycy589 2006-08-26 05:29:59
一个关于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#里怎么实现。。。)



请高手指点一下,万分感谢!!!

...全文
1035 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
ycy589 2006-09-14
  • 打赏
  • 举报
回复
谢谢
  • 打赏
  • 举报
回复
你自己查看文档!第一个参数是"",功能就是创建对象,而是null才是查询对象。

总应该是为了功能,你不能为了“调试通过”而写程序吧。

如果没有运行时异常发生,也就没有调试,也就不用在发布的程序中要写上try...catch。你调试不通过,那么不正说明你的曾旭应该在catch处理吗?我上面很多文字都白费了。呵呵。
fds2003 2006-08-28
  • 打赏
  • 举报
回复
关注!!!
dlzhangln 2006-08-28
  • 打赏
  • 举报
回复
bang ding
ycy589 2006-08-28
  • 打赏
  • 举报
回复
只要问题,还不是这个,还是用GetObject的话,还是产生很多word进程
ycy589 2006-08-28
  • 打赏
  • 举报
回复
参数是null的话,调试不通过啊

只有""才能通过啊
kingtoo010 2006-08-27
  • 打赏
  • 举报
回复
帮顶..接分...
------------------------------------------------------------------------------------
100M.Net空间+50M企业邮局=60元/年
100M.Net空间+国际顶级域名=100元/年
国际顶级域名.com.net.cn=50元/年
本站申请域名可绑定免费10M Asp.Net空间
1000M.Net空间 + 100M MsSql数据库 + 1000M企业邮局 + 顶级域名=600元/年
数据库 企业邮局 网站推广 整机租用 美国空间 网站建设 均有售
还有很多优惠套餐提供给各个用户层.
有意者可联系电话:021-64802212 传真:021-64802212
咨询信箱:info@kingtoo.com 咨询OICQ:68311305,379620139 81778640
  • 打赏
  • 举报
回复
建议使用SingleTon的方式,在后台驻留一个应用,利用这个应用去分配同时可以转接多少个Word应用,达到一定的并发量时,后续的请求都只能等待。
——————————————————————————————————————————
那么谁是服务器呢?为什么要自己写一个服务器程序来再次引用OLE进程外服务,而不是直接在应用程序中使用已经写好的OLE服务?自己写服务是否就能让所有今后的应用都使用它从而取代已经有的OLE进程外服务?这样的解决方案是比一条 GetObject 命令更简单了还是更加清晰了?
  • 打赏
  • 举报
回复
呵呵,突然意识到你把我给“骗”啦!

我写的 GetObject 中第一个参数是 null,你怎么能给写成""呢?
  • 打赏
  • 举报
回复
哦,我用程序调试了一下,Microsoft.VisualBasic.Interaction.GetObject果然厉害,可以在进程不存在的时候自动创建(肯定是通过读注册表来获得它的信息),比过去.NET之前要简单多了。过去要检测GetObject,然后在返回null或者异常的时候调用CreateObject。

Microsoft.VisualBasic 中的很多方法、函数的功能都很强大,普遍比 .net framework 中其它地方同样功能的方法、函数都强大。

既然如此,打开Office的进程对象就根本不应该写new了,仅仅需要一句话:

Microsoft.Office.Interop.Word.ApplicationClass ap =
(Microsoft.Office.Interop.Word.ApplicationClass)
Microsoft.VisualBasic.Interaction.GetObject("", "Word.Application");
  • 打赏
  • 举报
回复
我的意思意思是

Microsoft.Office.Interop.Word.ApplicationClass ap;
//try
//{
ap =(Microsoft.Office.Interop.Word.ApplicationClass)
Microsoft.VisualBasic.Interaction.GetObject("", "Word.Application");
//}
//catch
//{
// ap = new Microsoft.Office.Interop.Word.ApplicationClass();
//}

这样看看到底一返回什么异常。
gzlucky 2006-08-27
  • 打赏
  • 举报
回复
建议使用SingleTon的方式,在后台驻留一个应用,利用这个应用去分配同时可以转接多少个Word应用,达到一定的并发量时,后续的请求都只能等待。
ycy589 2006-08-27
  • 打赏
  • 举报
回复
Microsoft.Office.Interop.Word.ApplicationClass ap;
try
{
ap =(Microsoft.Office.Interop.Word.ApplicationClass)
Microsoft.VisualBasic.Interaction.GetObject("", "Word.Application");
}
catch
{
//ap = new Microsoft.Office.Interop.Word.ApplicationClass();
}

上贴写错了,不好意思
ycy589 2006-08-27
  • 打赏
  • 举报
回复
我已经注释了catch部分

不过我用的是ApplicationClass类,而不是Application接口,我想这两个应该一样的吧


下面就是:

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();
}


请指点,谢谢你了
  • 打赏
  • 举报
回复
你可以先把catch部分注释掉,然后把程序运行的异常信息的内容、堆栈等打印出来,贴出来!
  • 打赏
  • 举报
回复
上面只是个手写的例子,无法凭想象写却面,所以比较简略。按说 catch 后边必须捕获异常,仅仅对“不存在Excel.Application”的情况才应该new,其它情况说明系统有问题,应该 Throw new Exception。我手写代码的时候不知道 catch 后边捕获的特定 Exception 的类型怎么写,但是你写程序应该查资料写上。

调试的时候,应该让所有 Exception (的ToString())都显示或者记录到系统日志中。你要拷贝信息到这里,才知道问题出在什么地方。
ycy589 2006-08-27
  • 打赏
  • 举报
回复
就和使用new一样,新建一个进程

请指点,谢谢
ycy589 2006-08-27
  • 打赏
  • 举报
回复
TO:sp1234(如果只为活着,还不如不活)


我测试了,用了你这段程序

可还是,每新增一个用户操作生成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
ycy589 2006-08-26
  • 打赏
  • 举报
回复
请高手继续指导...

谢谢...
amingo 2006-08-26
  • 打赏
  • 举报
回复
讨论ASP。NET 2.0 新技术 QQ群:20810637(顶者有好报~)
加载更多回复(2)

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧