powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Подскажите по Task
11 сообщений из 11, страница 1 из 1
Подскажите по Task
    #39438330
csprogrammist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время. На форме кнопке, по ее нажатию должен быть выполнен запрос к БД и по его выполнению отобразиться message с уведомлением.
Метод на кнопке:
Код: c#
1.
2.
3.
4.
5.
6.
7.
await Task.Factory.StartNew(() => { Db.Send(); }).ContinueWith((t1) =>
       {
           if (t1.IsCompleted && !t1.IsFaulted && !t1.IsCanceled)
           {
                Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => MessageBox.Show("Выполнено", "Информация")));
           }
       }, TaskScheduler.FromCurrentSynchronizationContext());



Запрос выполняется асинхронно и отображается сообщение, но с каждым кликом кол-во сообщений инкрементируется. Как пофиксить?
...
Рейтинг: 0 / 0
Подскажите по Task
    #39438403
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
csprogrammist,

Плохая практика использовать await вместе ContinueWith.

Что возвращает Db.Send() ? Есть ли у Db.Send модфикатор async?
...
Рейтинг: 0 / 0
Подскажите по Task
    #39438459
csprogrammist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refreg,

Пробовал разные варианты, в последнем оставил await
Сигнатура Send:
public void Send (InputData data).
...
Рейтинг: 0 / 0
Подскажите по Task
    #39438466
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
csprogrammist,

await по сути, для того и нужен, чтоб не писать всю цепочку методов ContinueWith и бла бла бла. потом всё разворачивается в тот же самый код, если вы выполняете код из СurrentSynchronizationContext то какой смысл дёргать диспатчер?
для асинхронных вызовов в клиентах БД есть Async методы
...
Рейтинг: 0 / 0
Подскажите по Task
    #39438499
csprogrammist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

Я уже просто перебирать начал варианты. У этого клиента нет асинхронных вызовов
...
Рейтинг: 0 / 0
Подскажите по Task
    #39438513
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
csprogrammistRoman Mejtes,

Я уже просто перебирать начал варианты. У этого клиента нет асинхронных вызововХотя в этом примере написано не совсем по канону (await здесь ожидает когда ты кнопку нажмешь, а не когда метод выполниться), не ясно почему задвоенность. По этому коду вроде задвоенностей быть не должно.
...
Рейтинг: 0 / 0
Подскажите по Task
    #39438536
hoolygan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как-то оно через непонятно что сделано.
Создайте метод, который возвращает true при том как нет ошибок, внутри него Task.Run(() => {бла-бла-бла}), также выбрасывайте ошибки по throw и возвращайте false при ошибке
А в обработчике уже await метода - и обработка булевой переменной.
А эти все await + ContinueWith - оставьте в покое.
...
Рейтинг: 0 / 0
Подскажите по Task
    #39438569
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hoolygan,

имхо, но лучше сделать асинхронный метод обёртку, над методом клиента который будет возвращать таск, а потом делать по класической схеме.
...
Рейтинг: 0 / 0
Подскажите по Task
    #39438571
hoolygan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,
А что это изменит? Будет 2-ное вложение - таска будет вызывать таску тогда - и больше проблем с обработкой ошибок. А может я не правильно понял это выражение "асинхронный метод обёртку, над методом клиента который будет возвращать таск".
Но суть в том, что ТС плавает в тасках, не до конца понимая что это и с чем его едят.
...
Рейтинг: 0 / 0
Подскажите по Task
    #39438576
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hoolygan,

автор пишет, что клиент которым он пользуется не содержит ассихронных методов. Я предлагаю создать асинхронный метод "блаблаAsync", который будет реализовывать 1 часть кода автора, потом через await дергать этот метод, а всё, что в ContinueWith пихать ниже.
Возвращать True\False в случаи выполнения или ошибки это Bad practices. Метод должен возвращать то, что должен либо ничего. А за обработку должен отвечать TryCatch, а не результаты метода
...
Рейтинг: 0 / 0
Подскажите по Task
    #39438600
hoolygan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тогда вообще не проблема
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
private Task dbSend()
        {
            return Task.Run(() =>
                 {
                     try
                     {
                         Thread.Sleep(2000);
                         //throw new Exception("что-то не то");
                     }
                     catch (Exception)
                     {
                         throw;
                     }
                 });
        }

        private async void Form1_DoubleClick(object sender, EventArgs e)
        {
            try
            {
                await dbSend();
                MessageBox.Show("Ok");

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }


так... на коленке
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Подскажите по Task
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]