Выполнение длительной операции 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#, и он дает клиенту хорошее стабильное считывание, пока работает экспортер.

Как я уже сказал, это не идеально, но сейчас это работает для меня.

Другие вопросы по тегам