асинхронная функция - первый запуск, первый конец - C # WPF - PullRequest
0 голосов
/ 10 января 2019

У меня проблема, у меня есть текстовое поле управления, я активировал функцию keyup, поэтому, когда пользователь пишет идентификатор в системе, программа начинает поиск, пока не найдет пользователя.

я использую его с приведенным ниже примером кода

private async void PNationalNo_KeyUp(object sender, KeyEventArgs e)
{            
        string Ptext = Textbox.text;
        string ResposeDataP  = ""; 

        await Task.Run(() =>
        {
            ResposeDataP = RunAsyncGetOnePatient(Ptext, GV.AccountID).Result;
        });

        Patient1 = JsonConvert.DeserializeObject<PatientM>(ResposeDataP);


        if (Patient1 != null)
        {

            WrongMsg1.Text = "user '" + Patient1 .PatientFullName.ToLower() + "' have this ID number!";
        }
        else
        {
            WrongMsg1.Text = "there is no user have this ID!!";
        }
}

проблема с этим кодом, иногда, когда код находит результат в последних асинхронных баках, 1 из задач занимает больше времени, чем финальное, поэтому программа выводит результат этой поздней функции !! не последний? !! ((У пользователя нет этого идентификатора !!)), потому что это не последняя функция в асинхронном коде, так как я могу решить эту проблему? !!

Обновлено из комментариев

Я имею в виду, если пользователь ID = "123" в базе данных, когда я нажимаю 1, это первая функция.

Затем, когда я нажимаю 2, textbox = "12"

Когда я нажимаю 3 textbox = "123"

Таким образом, он должен печатать в WrongMsg1.Text, что пользователь найден, но проблема иногда заключается в функции textbox = "12" finish после функции "123", поэтому он печатает в "there is no user have this id!!".

ты меня понял? потому что async функция номер 2, завершена после последней функции.

1 Ответ

0 голосов
/ 10 января 2019

Кажется, это типичное состояние гонки. Поскольку Task.Run выполняется в фоновом потоке, у вас больше нет контроля над порядком выполнения, что означает, что ввод второго символа оценивается после третьего символа. Поэтому вам нужно найти способ убедиться, что порядок выполнения остается верным, когда вы вернетесь к контролю.

Возможным решением может быть проверка того, что текст в текстовом поле остается тем же после завершения асинхронной задачи:

    private async void PNationalNo_KeyUp(object sender, KeyEventArgs e)
        {            
            string Ptext = Textbox.text;
            string ResposeDataP  = ""; 

            await Task.Run(() =>
            {
                ResposeDataP = RunAsyncGetOnePatient(Ptext, GV.AccountID).Result;
            });

            if (Textbox.text != Ptext)
            {
                return;
            }

            Patient1 = JsonConvert.DeserializeObject<PatientM>(ResposeDataP);


            if (Patient1 != null)
            {

                WrongMsg1.Text = "user '" + Patient1 .PatientFullName.ToLower() + "' have this ID number!";
            }
            else
            {
                WrongMsg1.Text = "there is no user have this ID!!";
            }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...