Нет, отладка здесь не причем. Кстати отладка многопоточных приложений тоже требует определенного навыка. Но, так как мы разобрались в причинах, то пока отладка вам не нужна.
Попробую объяснить простым языком.
Многопоточность применяется для того, чтобы выполнять некие длительные действия в приложении, при этом само приложение остается доступным и в нем можно продолжать работать. В вашем случае, после запуска формы вы начинаете строить отчет (то самое длительное действие) и отображаете так называемый ProgressBar, отображающий процесс построения отчета.
В случае избавления от многопоточности, код по построению отчета будет выполняться синхронно, т.е. форма вашего приложения не будет доступна до тех пор, пока выполняется построение отчета. Для пользователя это будет выглядеть как будто программа "зависла". После того как отчет построится, пользователь все же увидет форму с данными.
фрагмент я нашел, но, если честно, не знаю как именно поместить его под обработку этих событий. Наверно в ProgressDlg.cs эти события руками создать?
Прошу прощения за простые вопросы, думаю мне не хватает знаний C#
Открываете вашу форму в Visual Studio. В редакторе дважды щелкаете на заголовок формы (там где иконка, заголовок ProgressDlg и кнопки сворачивания, закрытия и минимизации). После этого у вас создается подписка на событие Load и генерируется код:
private void ProgressDlg_Load(object sender, EventArgs e)
{
}
В методе
Execute класса
CalcAreaAction удаляете параметр
worker и удаляете в этом методе все что связано с
worker.
Метод обработки события Load должен получиться примерно такой:
private void ProgressDlg_Load(object sender, EventArgs e)
{
CalcAreaAction act = new CalcAreaAction();
act.Execute(ActiveDocument);
m_log.Text = act.Log;
m_close.Enabled = true;
m_logToFile.Enabled = true;
}
Код команды после этого должен вылдяеть так (не должно быть вызова метода RunWorker):
public Result Execute(ExternalCommandData commandData,
ref string message, ElementSet elements)
{
ProgressDlg dlg = new ProgressDlg();
dlg.ActiveDocument = commandData.Application.ActiveUIDocument.Document;
dlg.ShowDialog();
//dlg.RunWorker();
return Result.Succeeded;
}