Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: bargool от 11-02-2015, 19:12:19

Название: Использование AutoCAD API из Dispose своих классов
Отправлено: bargool от 11-02-2015, 19:12:19
В процессе поисков причин произвольных падений автокада у моих пользователей (падает в произвольный момент времени практически без какой-либо системы) наткнулся на оставленный без ответа комментарий Tony Tanzillo (http://through-the-interface.typepad.com/through_the_interface/2008/06/cleaning-up-aft.html#comment-1292065881)
Соответственно, хочу уточнить: если я реализую свой класс, который реализует интерфейс IDispose, затем пользуюсь им с помощью конструкции using, лучше в моём Dispose ничего не менять в чертежах? (Я не уверен, из какого потока вызывается Dispose в этом случае)
Соответственно, если ответ "да" (не надо менять), то будет ли безопасным использовать паттерн dispose от Microsoft (https://msdn.microsoft.com/en-us/library/vstudio/fs2xkftw%28v=vs.100%29.aspx)?
Каюсь, уже позабыл тему GC, да и не залезал толком в это дело
Название: Re: Использование AutoCAD API из Dispose своих классов
Отправлено: Александр Ривилис от 11-02-2015, 19:27:07
Я не уверен, из какого потока вызывается Dispose в этом случае
Вообще-то сам Dispose() в случае использования using вызывается из этого же потока. А вот если ты не используешь using, то для гарантии вызова Dispose() из главной задачи: http://adndevblog.typepad.com/autocad/2012/07/forcing-the-gc-to-run-on-the-main-thread.html
Название: Re: Использование AutoCAD API из Dispose своих классов
Отправлено: bargool от 11-02-2015, 19:32:59
А если внутри using код падает, или выбрасывается исключение, то Dispose всё равно вызывается из того же потока, или этим уже GC занимается?
Название: Re: Использование AutoCAD API из Dispose своих классов
Отправлено: Александр Ривилис от 11-02-2015, 19:36:35
А если внутри using код падает, или выбрасывается исключение, то Dispose всё равно вызывается из того же потока, или этим уже GC занимается?
Интересный вопрос. Думаю, что тут нужно проверить экспериментально. Я не уверен, что в этой ситуации будет тот же самый поток.
Название: Re: Использование AutoCAD API из Dispose своих классов
Отправлено: Александр Ривилис от 11-02-2015, 20:31:22
Простой, но как мне кажется показательный тест:
Код - 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.