Wordapp 未在线程或并行进程中关闭

2024-03-27

下面的代码通常可以工作,并且在将 docx/doc 保存到 pdf 后打开和关闭 word,但是当在线程或并行 for 循环中使用以下代码时,它不会,有任何想法吗?我已经提供了下面的所有代码。

这是在函数中使用时工作正常的代码。

     wordApp = new Microsoft.Office.Interop.Word.Application();
        Microsoft.Office.Interop.Word.Document wordDocument = wordApp.Documents.Open(sourceFile, false);
        wordDocument.ExportAsFixedFormat(destFile, WdExportFormat.wdExportFormatPDF);
        object saveOption = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges;
        object originalFormat = Microsoft.Office.Interop.Word.WdOriginalFormat.wdOriginalDocumentFormat;
        object routeDocument = false;


        if (wordDocument != null)
            ((_Document)wordDocument).Close(ref saveOption, ref originalFormat, ref routeDocument);

        if (wordApp != null)
            ((_Application)wordApp).Quit(ref saveOption, ref originalFormat, ref routeDocument);

        wordDocument = null;
        wordApp = null;

下面是我尝试调用上面代码的 Parallel.For 代码:

   Parallel.For(1, Int32.Parse(iNrOfThreads.Text), new ParallelOptions { MaxDegreeOfParallelism = Int32.Parse(iNrOfThreads.Text) }, i =>                 
            {
                fileName = fileNameLarge + i.ToString() + ".doc";
                fileName2 = fileNameLarge + i.ToString() + ".pdf";
                string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
                string destFile = System.IO.Path.Combine(targetPath, fileName2);

                GeneratePDFWithProgressWithCreate(sourceFile, destFile);

            });

下面是生成线程的 for 循环,我尝试调用上面的代码:

    for (int i = 1; i <= Int32.Parse(iNrOfThreads.Text); i++)
            {
                //fileName2 = fileNameSmall + i.ToString() + ".docx";
                fileName = fileNameLarge + i.ToString() + ".doc";
                fileName2 = fileNameLarge + i.ToString() + ".pdf";
                string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
                string destFile = System.IO.Path.Combine(targetPath, fileName2);

                // To copy a file to another location and 
                // overwrite the destination file if it already exists.
                //System.IO.File.Copy(sourceFile, destFile, true);

                //Thread thread = new Thread(() => GeneratePDFWithProgress(sourceFile, destFile + ".pdf"));
                Thread thread = new Thread(() => GeneratePDFWithProgressWithCreate(sourceFile, destFile));
                thread.Name = "Thread" + i.ToString();
                thread.IsBackground = true;
                thread.SetApartmentState(ApartmentState.MTA);
                thread.Start();              
            } 

我通过声明变量 local 解决了这个问题

从原始代码

    wordApp = new Microsoft.Office.Interop.Word.Application();

我把它改为

    Microsoft.Office.Interop.Word.Application wordAppPrivate = new Microsoft.Office.Interop.Word.Application();

所以现在它是函数的本地函数,这里是使用我创建的线程调用的函数的完整代码

    void GeneratePDFWithProgressWithCreate(string wordFilename, string pdfFilename)        
    {       
            // Update Progress bar to see start of threads         
            UpdateProgress();
            // Setup Word Application
            Microsoft.Office.Interop.Word.Application wordAppPrivate = new Microsoft.Office.Interop.Word.Application();
            Microsoft.Office.Interop.Word.Document wordDocument = wordAppPrivate.Documents.Open(wordFilename, false);
            wordDocument.ExportAsFixedFormat(pdfFilename, WdExportFormat.wdExportFormatPDF);
            object saveOption = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges;
            object originalFormat = Microsoft.Office.Interop.Word.WdOriginalFormat.wdOriginalDocumentFormat;
            object routeDocument = false;

            if (wordDocument != null) 
                ((_Document)wordDocument).Close(ref saveOption, ref originalFormat, ref routeDocument);
            if (wordAppPrivate != null)
                ((_Application)wordAppPrivate).Quit(ref saveOption, ref originalFormat, ref routeDocument);

            if (wordDocument != null)
                System.Runtime.InteropServices.Marshal.ReleaseComObject(wordDocument);

            if (wordAppPrivate != null)
                System.Runtime.InteropServices.Marshal.ReleaseComObject(wordAppPrivate);

            wordDocument = null;
            wordAppPrivate = null;
            //GC.Collect(); // force final cleanup!

            // Update progress bar to see finishing the conversion
            UpdateProgress();               
        //}
    }

我希望这能帮助其他有类似问题的人!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Wordapp 未在线程或并行进程中关闭 的相关文章

  • C# 创建函数队列

    我写了一个名为 QueueManager 的类 class QueueManager Queue functionsQueue public bool IsEmpty get if functionsQueue Count 0 return
  • 起订量要求?违背了目的?

    是否需要虚拟化您想要模拟的所有属性访问器就违背了模拟的目的 我的意思是 如果我必须修改我的对象并虚拟化我想要模拟的每个访问器 我难道不能继承我的类并自己模拟它吗 你的问题非常有效 但如果你仔细想想 没有其他方法可以模拟课程 如果你采用一个接
  • 将图像文件从网址复制到本地文件夹?

    我有该图像的网址 例如 http testsite com web abc jpg http testsite com web abc jpg 我想将该 URL 复制到 c images 中的本地文件夹中 而且当我将该文件复制到文件夹中时
  • 键盘加速器在 UWP 应用中停止工作

    我正在尝试将键盘加速器添加到 UWP 应用程序中的 CommandBar 菜单项 当应用程序启动时 这工作正常 但在我第一次打开溢出菜单后 加速器停止工作 这似乎不会发生在主要命令 菜单之外 上 只有溢出菜单内的辅助命令才会发生 此外 单击
  • 在Application_AquireRequestState事件中用POST数据重写Url

    我有一个在其中注册路线的代码Application AcquireRequestState应用程序的事件 注册路由后 我会在 Http 运行时缓存中设置一个标志 这样我就不会再次执行路由注册代码 在此事件中注册路线有特定原因Applicat
  • 是否有像 gccxml 这样的用于生成包装器的 C 标头解析器工具?

    我需要为一种新的编程语言编写一些 C 标头包装器 并且想要类似 gccxml 的东西 但不完全依赖 gcc 以及它在 Windows 系统上带来的问题 只需要读C而不是C 只要有完整的文档记录 任何格式的输出都可以 Linux Solari
  • 存储过程上的 OdbcCommand - 输出参数上出现“未提供参数”错误

    我正在尝试执行存储过程 通过 ODBC 驱动程序针对 SQL Server 2005 但收到以下错误 过程或函数 GetNodeID 需要参数 ID 但未提供该参数 ID 是我的过程的 OUTPUT 参数 在存储过程中指定了一个输入 mac
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 默认值 C# 类 [重复]

    这个问题在这里已经有答案了 我在控制器中有一个函数 并且我收到表单的信息 我有这个代码 public Actionresult functionOne string a string b string c foo 我尝试将其转换为类似的类
  • 我可以仅在少数情况下关闭模拟吗

    我有一个始终使用模拟的应用程序 但是 当用户以管理员身份登录时 一些操作需要他们写入服务器本身 现在 如果这些用户在实际服务器上没有权限 有些用户没有 则不会让他们写入 我想做的是关闭几个命令的模拟 有没有办法做这样的事情 using Ho
  • 无法加载文件或程序集“EntityFramework,版本=6.0.0.0”

    我究竟做错了什么 我该如何解决这个问题 我有一个包含多个项目的解决方案 它是一个 MVC NET 4 5 Web 应用程序 在调试模式下启动后调用其中一个项目时 出现此错误 导致此错误的项目具有以下参考 两个都是版本6 0 0 0 应用程序
  • 您可以在一个 Windows Azure 实例上部署多个 Web 应用程序吗?

    是否可以在一个 windows azure 小型计算实例中运行一堆 Web 应用程序 我正在考虑使用 Azure 作为放置一堆处于开发和非生产状态的项目 Web 应用程序 的地方 有些实际上已经被封存了 但我想在某个地方有一个活跃的实例 我
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • 特征密集稀疏矩阵乘积是线程化的吗?

    我知道稀疏密集产品是根据文档进行线程化的 https eigen tuxfamily org dox TopicMultiThreading html https eigen tuxfamily org dox TopicMultiThre
  • dropdownlist DataTextField 由属性组成?

    有没有一种方法可以通过 C 使 asp net 中的下拉列表的 datatextfield 属性由对象的多个属性组成 public class MyObject public int Id get set public string Nam
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • 错误左值需要作为赋值C++的左操作数

    整个程序基本上只允许用户移动光标 如果用户位于给定的坐标范围 2 2 内 则允许用户键入输入 我刚刚提供了一些我认为足以解决问题的代码 我不知道是什么导致了这个问题 你能解释一下为什么会发生吗 void goToXY int int 创建一
  • 从 C 线程调用 Python 代码

    我对从 C 或 C 线程调用 Python 代码时如何确保线程安全感到非常困惑 The Python 文档 http docs python org c api init html non python created threads似乎是
  • 从有符号字符转换为无符号字符然后再转换回来?

    我正在使用 JNI 并有一个 jbyte 类型的数组 其中 jbyte 表示为有符号字符 即范围从 128 到 127 jbyte 表示图像像素 对于图像处理 我们通常希望像素分量的范围为0到255 因此 我想将jbyte值转换为0到255
  • c# 模拟 IFormFile CopyToAsync() 方法

    我正在对一个异步函数进行单元测试 该函数将 IFormFile 列表转换为我自己的任意数据库文件类列表 将文件数据转换为字节数组的方法是 internal async Task

随机推荐

  • Java 的 SASS 实现? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 Java 中的 SASS 实现 可以与 JSP JSF 一起使用 对于 Python 我找到了 CleverCSS 但对于 J
  • 把我从 IE6 中拯救出来

    我正准备开始为一家相当大的公司开发一个新的网络项目 对于他们的所有用户 大约 17 000 人 来说 他们都被 IE6 困住了 他们计划在今年年底前让所有人过渡到 IE7 但 IT 部门开始推迟这一承诺 我被要求做的是给项目发起人更多的支持
  • 臭名昭著的 java.sql.SQLException: 找不到合适的驱动程序

    我正在尝试将支持数据库的 JSP 添加到现有的 Tomcat 5 5 应用程序 GeoServer 2 0 0 如果有帮助的话 应用程序本身与 Postgres 通信得很好 所以我知道数据库已启动 用户可以访问它 所有这些都是好东西 我想要
  • 如何在Android中获取电话簿中的所有联系人到SIM卡中?

    我正在努力从我的应用程序中的电话簿和 SIM 卡中获取所有联系人 我想将所有联系人存储在我的应用程序 SQLite DB 中 我正在使用的代码在正常情况下工作正常 在以下条件下出现问题 对于没有名字的联系人 那只是号码 SIM 卡中的联系人
  • 在 Javascript 中访问 Json

    SponsorID 382 SponsorName Test Name MonthEndReport true AccountingManager Me UnboundProperties State 16 当我尝试像这样访问上面的内容时
  • Google应用程序引擎过多的数据存储小操作

    我的网站有大约 50 个用户 并且我正在进行过多的小型数据存储操作 我正在积极进行内存缓存 没有那么多记录 但我仍然得到数百万个小型数据存储操作 Appstats 说成本为 0 但实际成本并非 0 我基本上知道小型数据存储操作可能发生在哪里
  • Rails,咖啡脚本出现语法错误

    我正在尝试使用 jquery ui 库在 Rails 中执行自动完成功能 但是我不断收到语法错误 语法错误 保留字 函数 在线 这是我的 Lesson js coffee 文件 jQuery gt function function spl
  • 在 Ruby on Rails 中获取控制器中 URL 的锚点部分

    有没有办法在控制器中获取 URL 的锚点部分 示例 如果我输入http www foo com bar anchor123 http www foo com bar anchor123我可以在我的控制器中获取字符串anchor123吗 在
  • 重写子文件夹的 url 条件

    我这里有一个 htaccess 文件 en htaccess 我想让这个条件 适用于 public html 内的主要 htaccess 也适用于子文件夹en RewriteCond THE REQUEST events eventDeta
  • 打开文件和读取内容的最可靠的方法是什么[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 当我必须始终读取整个文件时 我通常会
  • 使用 jQuery 设置列宽

    我有带有格式的 html 表 div table tbody tr td Set Width 10 Px td td Set Width 20 Px td tr tr Same for all tr tr tbody table div 即
  • 为什么 IDEA 显示 JavaDoc 错误?

    param string throws ApplicationException IDEA 突出显示 字符串 并告诉 未找到文档 为什么会这样 为以下内容编写一些文档string参数或调整声明有 Javadoc 问题检查设置 以免报告此类问
  • 应用程序要求首先将程序集 microsoft.reportviewer.processingObjectModel 版本 11.0.0.0 安装在全局程序集缓存中

    我有一个在 Visual Studio 2012 中创建的小型 Windows 窗体应用程序 它使用 ReportViewer 版本 11 0 0 0 应用目标框架为 NET 4 0 部署方式为ClickOnce 在我的电脑上可以安装 但在
  • Node.JS Schema.pre('save) 不更改数据

    我正在制作用户授权系统 并希望在将密码保存到数据库之前对其进行哈希处理 为了达到这个目的 我使用 bcrypt nodejs 上面标题中的问题 var mongoose require mongoose var bcrypt require
  • 如何正确处理分块编码请求?

    我有两个网站 一个使用 PHP 的 Lighttpd 第二个使用 Apache 这两个网站都不能正确处理分块传输编码 我从我的手机 J2ME 发送此请求 并且无法将此传输类型更改为任何其他类型 所以我唯一的方法是以其他方式处理分块传输编码请
  • Android Studio 2.2 预览版在实现数据绑定时抛出错误

    我已将 android studio 更新到 2 2 预览版 1 并按指定应用了 google 和 firebase 的指定依赖项 但仍然出现以下错误 EmptyThrowable Wrong dependency type class c
  • XMLHttpRequest setRequestHeader() --> 有没有办法设置标头值,而不是附加到它?

    from http www w3 org TR XMLHttpRequest the setrequestheader method http www w3 org TR XMLHttpRequest the setrequestheade
  • 验证正整数

    我只想允许数字字段使用正整数 包括零 如何使用 JSR 303 定义此验证 I tried Min value 0 message msg1 但它允许浮点值 如 1 2 Digits fraction 0 integer 10 messag
  • 线程拥有堆栈和进程拥有堆栈的策略是什么?

    线程拥有堆栈和进程拥有堆栈的策略是什么 如果我们有 10 个进程 那么我们有多少个堆栈 10 个 如果一个进程下有 10 个线程 那么我们有多少个堆栈 1 所有线程共享同一个堆栈 Thanks 如果你考虑一下堆栈是什么 那么共享堆栈是没有意
  • Wordapp 未在线程或并行进程中关闭

    下面的代码通常可以工作 并且在将 docx doc 保存到 pdf 后打开和关闭 word 但是当在线程或并行 for 循环中使用以下代码时 它不会 有任何想法吗 我已经提供了下面的所有代码 这是在函数中使用时工作正常的代码 wordApp