Выполнение длительной операции COM в C#, невозможно удалить подозрительное сообщение
Я работаю над этим уже неделю и широко использую Stackru, но не могу понять это.
Я пишу плагин для C# в продукте Autodesk и подключен (с 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-файл для работы.
Я нахожу множество примеров того, как справиться с этим, в гипотетическом (много BS для console.write), но нет ничего, что на самом деле имеет конкретный пример, где длительный процесс 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 ответ
Поскольку у меня больше не было времени работать над этим, я объясню, как я решил это. Вероятно, это не рекомендуемый способ решения этой проблемы, но у него есть некоторые преимущества.
В несвязанном проекте несколько месяцев назад я сделал похожее приложение, в котором экспортировал файл того же формата, но из консольного приложения. Не было проблем с консольным приложением, как эти проблемы, возникающие в DLL из продукта AutoDesk.
Используя то, что я запомнил при экспорте консольного приложения, я сделал новое маленькое exe консольного приложения, которое выполняло только экспорт файла. Затем я использовал команду System.IO.Process.Start(file.exe, "arguments") в родительской dll для запуска исполняемого файла.
Это очень обходной способ избавиться от всплывающих сообщений, но есть некоторые преимущества. Исполняемый файл выполняет экспорт, а C# DLL продолжается. Это позволяет мне запускать простой цикл "существует файл", пока файл не появится в каталоге, а затем продолжится. Я поместил счетчик прогресса в пользовательский интерфейс DLL C#, и он дает клиенту хорошее стабильное считывание, пока работает экспортер.
Как я уже сказал, это не идеально, но сейчас это работает для меня.