У меня есть старая форма, которую я действительно не хочу переписывать на этом этапе, поэтому я загружаю форму и затем добавляю ее на панель в новой форме пользовательского интерфейса.Это работает нормально, но медленно.Старая форма выполняет большую часть загрузки и сбора данных, и она не очень эффективна.Таким образом, для загрузки больших записей требуется до 30 секунд.Как вы знаете, создание формы затем блокирует основной интерфейс на 30 секунд, пока загружается старая форма.Это действие, которое я пытаюсь предотвратить.Я хочу загрузить новую форму, отобразить gif «Загрузка» на пустой панели, а затем, после загрузки старой формы, удалить изображение «Загрузка» и добавить форму в качестве элемента управления.
И вот начинаетсяпроблема.
Я пытался создать Background Worker, но это вызывает ошибку STA (старая форма имеет несколько собственных потоков загрузки данных), и так как я не могу изменить рабочий на STA, я остановилсяпытаюсь.
Я пытался создать Invoke (и BeginInvoke), и хотя это работает, он не загружает старую форму в потоке.Он просто отправляет его обратно в поток пользовательского интерфейса и выполняет работу там.Опять же это висит пользовательский интерфейс.IE: не то, что я хочу.
Я пытался создать делегата и вызвать его как событие в потоке, но я получаю те же результаты, что и ниже ...
I 'Мы создали поток, установили STA, запустили его, а затем сделали цикл while с DoEvents, ожидающими его завершения.Конечно, кажется, что все это работает вплоть до обычного добавления формы на панель, а затем я получаю доступ «Control 'ChartForm' из потока, отличного от потока, в котором он был создан».В этой ошибке ChartForm - это старая диаграмма, которая была загружена в потоке.
Я попробовал описанный выше метод, но вместо этого я использовал частное статическое поле для хранения создания старой формы, а затемдобавив его на панель после завершения потока.Это в методе, который создал поток, сразу после цикла while.Та же ошибка.
Итак, я использовал вышеупомянутый метод в других местах с DataTables и у меня не было никаких проблем с возвратом данных в основной поток для использования с DataBinding.Я знаю, что это немного по-другому, но я не думал, что это будет так сложно сделать.
Ниже приведен код, который я пытался использовать, который кажется наиболее близким к тому, что я хочу.
private static _ChartForm;
private void LoadPatientChart()
{
ClearMainPanel(); // Removes any loaded ChartForms from Panel
if (_Patient == null) // Test to make sure a patient is loaded
return;
loadingPanel.Visible = true; // Displays the "Loading" gif
Thread thread = new Thread(new ThreadStart(this.GetChartForm));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
while (thread.ThreadState != ThreadState.Stopped)
Application.DoEvents(); // Keeps the UI active and waits for the form to load
this.ChartPanel.Controls.Add(_ChartForm); // This is where the error is
loadingPanel.Visible = false; // Hide the "Loading" gif
}
private void GetChartForm()
{
ChartForm chartForm = new ChartForm(_Patient.AcctNum.ToString(), false);
chartForm.TopLevel = false;
chartForm.FormBorderStyle = FormBorderStyle.None;
chartForm.Dock = DockStyle.Fill;
chartForm.Visible = true;
_ChartForm = chartForm;
}