[Дополнительные примечания: я использую .NET 3.0]
Даже когда я использую метод, описанный в «Как обновить графический интерфейс из другого потока в C #?»другие части этой функции (UpdateDone) не работают (даже части, которые не имеют ничего общего с многопоточностью, не работают, потому что некоторые части класса были доступны вне текущего потока).
// This now works
DelegationClass.SetPropertyThreadSafe(lblStatus, () => lblStatus.Text, pData.LastError);
// Later on down the function, both objects are a member of the same class, the variable icon was never touched by another thread.
this.Icon = icon;
// An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll
// Additional information: Cross-thread operation not valid: Control 'frmMain' accessed from a thread other than the thread it was created on.
Исправьте меня, если я 'Это неправильно, но поскольку вызывается EndInvoke, поток должен был прерваться.Поэтому не должно быть никаких «условий гонки»;все данные снова принадлежат первичному потоку, и я могу свободно делать с данными то, что я хочу ...?
В этой структуре есть несколько элементов, которые я использую во всем классе;Есть ли лучший способ сделать это?Как бы вы это сделали?
Основные ограничения:
* Отдельная функция выполняет опрос данных, идея не состоит в том, чтобы блокировать взаимодействие с пользовательским интерфейсом.
* Поэтому эта функция должна быть асинхронной
* Основной класс Form (frmMain) должен быть уведомлен (Async) о завершении рассматриваемой функции и, при необходимости, обновить ее GUI.
* И, конечно, прежде всего, данные, полученные функцией, должны быть легкодоступно для членов frmMain
(Боже, с C ++ многопоточность была намного проще)