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

26/10/2014

Формы внутри асинхронных команд внутри AutoCAD

Возможно вы уже попробовали очень приятную возможность асинхронного выполнения (async) в .NET 4.5

Когда внутри асинхронной команды AutoCAD 2015 мы используем формы, часто случается, что контекст синхронизации не восстанавливается корректно после закрытия формы. Это часто провоцирует непредсказуемое поведение. Например, результат работы Editor.WriteMesage не отображается в командной строке.

Простейший способ обойти эту проблему – это сохранить текущий контекст перед показом формы и восстановить его после закрытия формы.

Вот пример такого использования:

Код - C#: [Выделить]
  1. // Эмулируем асинхронную функцию
  2. private static async Task<string> AsyncTask(string name)
  3. {
  4.     await Task.Delay(5000);
  5.  
  6.     return "Привет, " + name;
  7. }
  8.  
  9. [CommandMethod("ADN", "SyncContextCmd", CommandFlags.Transparent)]
  10. async static public void SyncContextCmd()
  11. {
  12.     Document doc = Application.DocumentManager.MdiActiveDocument;
  13.     Database db = doc.Database;
  14.     Editor ed = doc.Editor;
  15.  
  16.     // Сохраняем текущий контекст синхронизации
  17.     var syncContext = SynchronizationContext.Current;
  18.  
  19.     AdnForm form = new AdnForm();
  20.  
  21.     var dialogResult = Application.ShowModalDialog(form);
  22.  
  23.     // Восстанавливаем контекст синхронизации
  24.     SynchronizationContext.SetSynchronizationContext(
  25.         syncContext);
  26.  
  27.     if (dialogResult != System.Windows.Forms.DialogResult.OK)
  28.         return;
  29.  
  30.     // Обрабатываем результаты асинхронно
  31.     string result = await AsyncTask(form.UserName);
  32.  
  33.     // editor.WriteMessage теперь работает нормально
  34.     ed.WriteMessage("\nРезультат: " + result + "\n");
  35. }

 

Источник: http://adndevblog.typepad.com/autocad/2014/10/display-forms-inside-async-autocad-commands.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=1047

Опубликовано 26.10.2014