Использование AutoCAD API из Dispose своих классов

Автор Тема: Использование AutoCAD API из Dispose своих классов  (Прочитано 5463 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн bargoolАвтор темы

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
В процессе поисков причин произвольных падений автокада у моих пользователей (падает в произвольный момент времени практически без какой-либо системы) наткнулся на оставленный без ответа комментарий Tony Tanzillo
Соответственно, хочу уточнить: если я реализую свой класс, который реализует интерфейс IDispose, затем пользуюсь им с помощью конструкции using, лучше в моём Dispose ничего не менять в чертежах? (Я не уверен, из какого потока вызывается Dispose в этом случае)
Соответственно, если ответ "да" (не надо менять), то будет ли безопасным использовать паттерн dispose от Microsoft?
Каюсь, уже позабыл тему GC, да и не залезал толком в это дело
« Последнее редактирование: 11-02-2015, 19:27:00 от bargool »
Алексей

Отмечено как Решение bargool 12-02-2015, 09:36:42

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я не уверен, из какого потока вызывается Dispose в этом случае
Вообще-то сам Dispose() в случае использования using вызывается из этого же потока. А вот если ты не используешь using, то для гарантии вызова Dispose() из главной задачи: http://adndevblog.typepad.com/autocad/2012/07/forcing-the-gc-to-run-on-the-main-thread.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bargoolАвтор темы

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
А если внутри using код падает, или выбрасывается исключение, то Dispose всё равно вызывается из того же потока, или этим уже GC занимается?
Алексей

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А если внутри using код падает, или выбрасывается исключение, то Dispose всё равно вызывается из того же потока, или этим уже GC занимается?
Интересный вопрос. Думаю, что тут нужно проверить экспериментально. Я не уверен, что в этой ситуации будет тот же самый поток.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Простой, но как мне кажется показательный тест:
Код - C# [Выбрать]
  1. using System;
  2. using System.Threading;
  3. using System.Windows.Forms;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  7. using Autodesk.AutoCAD.DatabaseServices;
  8. using Autodesk.AutoCAD.Geometry;
  9. using Autodesk.AutoCAD.EditorInput;
  10. using Autodesk.AutoCAD.Windows;
  11.  
  12. // This line is not mandatory, but improves loading performances
  13. [assembly: CommandClass(typeof(TestThread.MyCommands))]
  14.  
  15. namespace TestThread
  16. {
  17.   public class TestDisp: IDisposable
  18.   {
  19.  
  20.     public TestDisp()
  21.     {
  22.       AcAp.Application.
  23.         ShowAlertDialog("TestDisp() ThreadId = " +
  24.         Thread.CurrentThread.ManagedThreadId);
  25.     }
  26.     public void Dispose()
  27.     {
  28.       AcAp.Application.ShowAlertDialog("Dispose() ThreadId = " +
  29.         Thread.CurrentThread.ManagedThreadId);
  30.     }
  31.   }
  32.  
  33.   public class MyCommands
  34.   {
  35.     [CommandMethod("MyCommand", CommandFlags.Modal)]
  36.     public void MyCommand()
  37.     {
  38.       try
  39.       {
  40.         using (new TestThread.TestDisp())
  41.         {
  42.           throw new System.Exception();
  43.         }
  44.       }
  45.       catch (System.Exception)
  46.       {
  47.         AcAp.Application.ShowAlertDialog("catch ThreadId = " +
  48.           Thread.CurrentThread.ManagedThreadId);
  49.       }
  50.     }
  51.   }
  52. }

Dispose вызывается в том же потоке и до catch.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение