Хорошо, есть несколько решений для исправления многопоточности Windows Forms. У меня вот так ... только с 1-секундной задержкой:
private delegate void StupidDumb();
private void StupidFreakingDumb()
{
RespondLbl.BeginInvoke(new StupidDumb(() => RespondLbl.Text = "Responding: Loading..."));
// Then refresh
new Thread(() =>
{
RespondLbl.BeginInvoke(new StupidDumb(() => RespondLbl.Text = $"Responding: {SerialCommunication.Responding}"));
// The 'SerialCommunication.Responding' property takes up to one second to retrieve information, which is the same amount of time the form is not responding.
}).Start();
}
private void RefreshBtn_Click(object sender, EventArgs e)
{
BeginInvoke(new Action(StupidFreakingDumb));
}
Я вставил это в код, но я добавлю и сюда:
"SerialCommunication" Свойство .Responding 'занимает до одной секунды для получения информации, то есть столько же времени, сколько форма не отвечает. "
В методе' RefreshBtn_Click 'я пробовал BeginInvoke, Invoke и новый поток instances.
Наиболее близким, что я получил, был новый метод Thread, который обновил форму, отображающую «Responding: Loading ...», но затем остановился на 1 целую секунду, пока SerialCommunication.Responding не вернул значение.
РЕДАКТИРОВАТЬ (у меня плохая привычка публиковать что-то, а затем вскоре находить решение):
Изменено
RespondLbl.BeginInvoke(new StupidDumb(() => RespondLbl.Text = $"Responding: {SerialCommunication.Responding}"));
на
string poop = SerialCommunication.Responding.ToString();
RespondLbl.BeginInvoke(new StupidDumb(() => RespondLbl.Text = $"Responding: {poop}"));
Исправлено Это. Просто убедитесь, что длинный процесс (например, SerialCommunication.Responding) не является частью метода Invoke / BeginInvoke. Поместите его в отдельный объект, затем, как только этот объект получит это значение, вызовите Invoke / BeginInvoke (незначительные различия, пробовал оба, даже не могу сказать)