我已经为此工作了一周并广泛使用了 StackOverflow,但我无法弄清楚这一点。
我正在 Autodesk 产品中用 C# 编写插件,并且我已(与 Marshal)连接到不同的 3D 应用程序。过去我已经为其他几十个插件做到了这一点,没有问题。
这个项目是独一无二的。在不同的 3D 应用程序中,我正在一个大型模型上运行一个长时间运行的任务(文件导出)。有时需要1-60分钟。
我收到毒消息:“此操作无法完成,因为'应用程序'没有响应。选择“切换到”并...” 从技术上讲,我可以让客户端只需单击“重试”,直到找到应用程序,但是这是不可取的。
我原本以为我只会放一个 DoEvents 类型的东西,它会等待导出完成,但是在导出子运行时会出现毒消息(这是我第一次出现毒消息,所以我正在学习)。然后我研究了在后台线程上运行这个导出操作,测试 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
}
}
}