在C#中运行长COM操作,无法删除有害消息

时间:2014-10-24 22:40:05

标签: c# com marshalling netmsmqbinding

我已经为此工作了一个星期,并且广泛使用了StackOverflow,但我无法解决这个问题。

我在Autodesk产品中用C#编写插件,并且我(与Marshal)连接到另一个3D应用程序。我过去曾为其他几十个插件做过这个,没有问题。

这个项目很独特。在不同的3D应用程序中,我在大型模型上运行长时间运行的任务(文件导出)。有时需要1-60分钟。

我收到了有害信息:"由于“应用程序”无法完成此操作。没有回应。选择"切换到"和..."从技术上讲,我可以让客户点击"重试"直到它找到应用程序,但这是不可取的。

我原本以为我只会放一个DoEvents类型的东西,它会等待导出完成,但导出子运行时会显示有害消息(这是我第一次出现有毒消息,所以我&#39 ; m学习)。然后我研究了在后台线程上运行这个导出操作,测试ThreadPool和Thread操作。但是,我可以"开始"该服务,但它永远不会从不同的3D应用程序导出模型。它只是永远运行。 (我从原始帖子中删除了错误消息,因为我没有找到该子问题的解决方案,而是我将在下面描述的内容)

最后,我试图修改NetMsmqBinding(我对此一无所知,但试图学习它)希望它将允许的重试次数设置为更大的数字。

        System.TimeSpan TS = new System.TimeSpan(0, 30, 10);
        System.TimeSpan TB = new System.TimeSpan(10, 0, 0);
        NetMsmqBinding NMB = new NetMsmqBinding();
        NMB.MaxRetryCycles = 1000;
        NMB.ReceiveRetryCount = 1000;
        NMB.RetryCycleDelay = TS;
        NMB.OpenTimeout = TB;

然而,无论我将NetMsmqBinding值更改为什么,我总是得到"重试"同时发送消息。我一定不能写得正确。在其他示例中,我注意到包含这些值的xml文件,我不知道xml是什么。我也不想知道,因为我宁愿在插件中运行,而不是有另一个xml文件来处理。

我在假设(很多console.write BS)中找到了很多关于如何处理这个问题的例子,但实际上没有任何具体例子表明长时间运行的COM进程正在中断主C#实用程序。

我真的想弄清楚如何重置重试频率和周期持续更长时间,以便不会显示有害信息。我怎么能这样做?

这里有更多代码,给出一些上下文:

namespace Testing_V0
{
    [PluginAttribute("Testing_V0R1", "ADSK", ToolTip = "Testing the plugin", DisplayName = "Testing the plugin")]
    [AddInPluginAttribute(AddInLocation.AddIn)]
    public class MyPlugin : AddInPlugin
    {
        public override int Execute(params string[] parameters)
        {
        System.TimeSpan TS = new System.TimeSpan(0, 30, 10);
        System.TimeSpan TB = new System.TimeSpan(10, 0, 0);
        NetMsmqBinding NMB = new NetMsmqBinding();
        NMB.MaxRetryCycles = 1000;
        NMB.ReceiveRetryCount = 1000;
        NMB.RetryCycleDelay = TS;
        NMB.OpenTimeout = TB;

        //NMB.ReceiveErrorHandling = ReceiveErrorHandling.Drop;

     //Do the Export process here
     }
    }
}

1 个答案:

答案 0 :(得分:-1)

因为我没有时间再研究这个问题,我将解释如何解决这个问题。它可能不是解决此问题的明智方法,但它有一些优点。

在几个月前的一个非相关项目中,我做了一个类似的应用程序,我导出了相同的文件格式,但是来自控制台应用程序。控制台应用程序没有问题,例如AutoDesk产品的dll中出现的这些问题。

使用我从控制台应用程序导出中记住的内容,我创建了一个新的小型控制台应用程序exe,只执行文件导出。然后我在父dll中使用System.IO.Process.Start(file.exe," arguments")命令来触发可执行文件。

这是摆脱弹出消息的一种非常迂回的方式,但有一些优点。可执行文件运行导出,而C#DLL继续。这允许我运行一个简单的文件存在循环,直到文件出现在目录中,然后继续。我在C#DLL UI中放置了一个进度计数器,它在导出器运行时为客户端提供了一个很好的稳定读出。

就像我说的那样,这并不理想,但现在这对我有用。