Invoke и BeginInvoke не будут работать в режиме истинной асинхронности - PullRequest
0 голосов
/ 27 апреля 2020

Хорошо, есть несколько решений для исправления многопоточности 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 (незначительные различия, пробовал оба, даже не могу сказать)

1 Ответ

0 голосов
/ 27 апреля 2020

Я просто положу ответ здесь:

Я изменил

RespondLbl.BeginInvoke(new StupidDumb(() => RespondLbl.Text = $"Responding: {SerialCommunication.Responding}"));

на

string poop = SerialCommunication.Responding.ToString();
RespondLbl.BeginInvoke(new StupidDumb(() => RespondLbl.Text = $"Responding: {poop}"));

Просто убедитесь, что длительный процесс (SerialCommunication. Ответ, в моем случае) не является частью метода Invoke / BeginInvoke. Присвойте его отдельному объекту, затем, как только у этого объекта будет это значение, запустите Invoke / BeginInvoke (незначительные различия, пробовал оба, даже не могу сказать)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...