Я пытался создать приложение для Windows, в котором, когда я получаю сообщение «some_string» (с сервера), мне нужно изменить цвет метки (sys2lbl в коде) на зеленый, и он должен оставаться зеленым в течение 15 секунд, а затем покраснеть. Однако, например, в течение 5-й секунды, если я снова получаю сообщение 'some_string', метка должна оставаться зеленой еще 15 секунд, т.е. всего 5+15 = 20.
Я использую Task.Run(), насколько я понимаю, эта задача должна быть как-то перезапущена, когда я получу строку 'some_string' в течение этих 15 секунд.
Примечание. Эта задача выполняется отлично, если я получаю «some_string» через 15 секунд.
Кто-нибудь знает, как это решить?
Task.Run(() =>
{
if (x.ApplicationMessage.Topic == "some_string")
{
sys2lbl.BackColor = Color.Green;
Thread.Sleep(15000);
sys2lbl.BackColor = Color.Red;
}
});
Thread.Sleep()
заключается в том, что он буквально спит поток, с которым вы взаимодействуете. Вы не можете делать что-либо еще с этим потоком, пока не истечет срок. Вот почему Thread.Sleep во многих случаях не обязательно является хорошей идеей. Похоже, вам может понадобиться поведение классаTimer
: docs.microsoft.com/en-us/dotnet/api/ - person Symon   schedule 10.06.2021Interval
на 5 секунд, если он все еще активен, в противном случае просто запустите его. -- Если вам действительно нужен другой Thread. - person Jimi   schedule 10.06.2021IProgrsss<T>
делегат, либоInvoke()
/BeginInvoke()
свой собственный делегат (вам нужно проверить, является ли синхронная версия более надежной, чем асинхронная), когда событие получено. Делегат, как описано, либо запускает таймер, либо увеличивает его интервал. - person Jimi   schedule 10.06.2021cancellationtoken
или подобным (как если бы вы предлагали решение), почему бы вам не пометить егоmqtt
и не опубликовать код, который вы используете для получения уведомлений издателя. ? Является ли ваш клиент также издателем? То есть у вас могут быть некоторые состояния гонки, которые вам нужно решить. - person Jimi   schedule 10.06.2021