powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# async... await
25 сообщений из 317, страница 1 из 13
C# async... await
    #39572254
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, помогите разобраться.
Разрабатываю приложения работы с базой данных Oracle.
Запросы могут быть долгоиграющими, поэтому на время его выполнения подключаю таймер и отражаю время в прогресс баре.
- Ситуация 1: здесь и далее - await wsp.Entity_SP(ИмяХП, sp, asp, RowToEntity);- вызов хранимой процедуры
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
      . . .
      при.tmrStart(); //-- Пуск таймера 
      try { await wsp.Entity_SP(ИмяХП, sp, asp, RowToEntity); }
      catch (System.InvalidOperationException ex) { throw new Exception(ex.Message); }
      catch (Exception ex) {
        при.tmrStop();
        MessageBox.Show(ex.Message, caption_Entity, MessageBoxButton.OK);
        bl_Разрешение = true;     //-- Разрешение выполнения функционала компонент
        return;
      }
      при.tmrStop();  //-- Останов таймера
      . . .

======= ПрогрессБар не работает.

- Ситуация 2:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
      . . .
      при.tmrStart(); //-- Пуск таймера 
      await Task.Run(() => wsp.Entity_SP(ИмяХП, sp, asp, RowToEntity));
      if (wsp.wspErr != null) {
        при.tmrStop();
        MessageBox.Show(wsp.wspErr, caption_Entity, MessageBoxButton.OK);
        bl_Разрешение = true;     //-- Разрешение выполнения функционала компонент
        return;
      }
      при.tmrStop();
      . . .

======= ПрогрессБар штатно.

Дискуссия состоялась здесь
...
Рейтинг: 0 / 0
C# async... await
    #39572272
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,
дружище, ты и сам можешь половину работы сделать.
Прогресс не работает когда нет потока.
Включаем отладку и идём по шагам по строчкам. Если есть поток, то всё нормально. Если нет, то пишем сюда и смотрим где ты его стартовать должен.
Окно потоков: Debug - Window - ...
...
Рейтинг: 0 / 0
C# async... await
    #39572276
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,
ну и можно сделать круче - не включать прогрессбар, пусть хранимка в фоне работает. Сделает - доложит).
РазДисаблишь контрол какой нить.
...
Рейтинг: 0 / 0
C# async... await
    #39572284
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев
Код: c#
1.
await Task.Run(() => wsp.Entity_SP(ИмяХП, sp, asp, RowToEntity));



это что, извините, за лютейший пздц?
какой асинк-эвейт здесь?
боржоми водкой запивай, чтобы не било по печени!

и это ещё что. прогресс бар на выполнение запросов? wat?! мдахх...
...
Рейтинг: 0 / 0
C# async... await
    #39572287
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttи это ещё что. прогресс баресли помнишь, он у него бесконечный туда-сюда).
хо-зя́-ин — ба́-рин.
...
Рейтинг: 0 / 0
C# async... await
    #39572336
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>hVostt, сегодня, 20:53 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1280515&msg=21046939] [21046939]
>это что, извините, за лютейший пздц?
это здесь .

>и это ещё что. прогресс бар на выполнение запросов? wat?! мдахх...
на слайде, в низу окна, зеленая полоска.
...
Рейтинг: 0 / 0
C# async... await
    #39572345
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевна слайде, в низу окна, зеленая полоска.
ну, тогда нормально по дизайну.
С остальным то что?
Основной вопрос не прогрессе ведь был.
...
Рейтинг: 0 / 0
C# async... await
    #39572356
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевэто здесь .

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

хотя в том треде об этом неоднократно говорилось. наверное какие-то проблемы с усвоением информации.


ВМоисеевна слайде, в низу окна, зеленая полоска.

по какому принципу "зелёная полоска" заполняется? по коду вы не получаете информации о прогрессе.
...
Рейтинг: 0 / 0
C# async... await
    #39572363
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttнаверное какие-то проблемы с усвоением информации
дипломат))
hVosttпо какому принципу "зелёная полоска" заполняется? по коду вы не получаете информации о прогрессе.
Иван Иваныч!
Бесконечный прогрессбар когда чем ближе к концу тем медленнее.
(предположение)
...
Рейтинг: 0 / 0
C# async... await
    #39572365
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев>hVostt, сегодня, 20:53 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1280515&msg=21046939] [21046939]
>это что, извините, за лютейший пздц?
это здесь .

>и это ещё что. прогресс бар на выполнение запросов? wat?! мдахх...
на слайде, в низу окна, зеленая полоска.

надо прогресс сверху, тогда хорошо показывается :)
...
Рейтинг: 0 / 0
C# async... await
    #39572367
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>hVostt, сегодня, 23:15 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1280515&msg=21047202] [21047202]
>никакой работы в вашем таске не выполняется...
Вы не правы:
Код: 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.
    . . .
    //-- Выполнение хранимой процедуры
    public static void Entity_SP(string spname, dlg_sp sp, OracleParameter[] asp, dlg_RowToEntity RowToEntity) {
      nRow = 0;  //-- Число строк в выборке
      reader = null;
      wspErr = null;

      try {
        using (OracleConnection connection = new OracleConnection(гп.str_Соединение)) {
          connection.Open();
          OracleCommand command = new OracleCommand("", connection);
          command.Parameters.Clear();
          command.Parameters.AddRange(asp);
          command.CommandText = spname;
          command.CommandType = CommandType.StoredProcedure;

          using (reader = (OracleDataReader)command.ExecuteReader()) {
            //-- Формируем коллекцию из выборки
            sp(RowToEntity); //-- Обратный вызов
          }
        }
      }
      catch (Exception ex){ wspErr = ex.Message; }
    }
    . . .



>по какому принципу "зелёная полоска" заполняется? по коду вы не получаете информации о прогрессе.
Практически определяется некий максимальный интервал выполнения самого длинного запроса для конкретного компьютера сети + гак и эта величина входит а настройки конкретного компа.
...
Рейтинг: 0 / 0
C# async... await
    #39572368
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

и где же этот код?
...
Рейтинг: 0 / 0
C# async... await
    #39572370
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>ViPRos, сегодня, 23:41 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1280515&msg=21047240][21047240]
>надо прогресс сверху, тогда хорошо показывается :)
Спасибо, завтра попробую
...
Рейтинг: 0 / 0
C# async... await
    #39572371
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,

по тику что ли?
...
Рейтинг: 0 / 0
C# async... await
    #39572373
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

ээ, ты чего? я первый раз себе позволил пошутить

await нифига не делает в первом случае
...
Рейтинг: 0 / 0
C# async... await
    #39572375
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да и во втором тоже
делай через бакгроундворкер
...
Рейтинг: 0 / 0
C# async... await
    #39572376
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>ViPRos, сегодня, 23:44 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1280515&msg=21047245] [21047245]
>и где же этот код?
Вы об этом?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    //-- Показ ожидания в ProgressBar-е
    private void dpt_Tick(object sender, EventArgs e) {
      iPgbFrm++;
      if (iPgbFrm < 2) return; //-- Ожидание менее 3 секунд ещё комфортно
      if (iPgbFrm == 2) { //-- С 3-ей секунды ожидания покажем ProgressBar
        pgbWin.Visibility = Visibility.Visible;
        pgbWin.Value = iPgbFrm;
        return;
      }
      pgbWin.Value = iPgbFrm % гп.tm_Запрос + 1;
    }


где:
pgbWin - ПрогрессБар
iPgbFrm - счетчик секунд
гп.tm_Запрос - максимальная величина
...
Рейтинг: 0 / 0
C# async... await
    #39572377
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
            if (wk == null)
            {
                wk = new BackgroundWorker();
                wk.WorkerReportsProgress = true;
                wk.WorkerSupportsCancellation = true;

                wk.DoWork += (s, w) =>
                {
                    BackgroundWorker sw = s as BackgroundWorker;
                    if (Disposing || IsDisposed) sw.CancelAsync();
                    else
                    {
                        if ((onLoad && main.refreshDataOnLoad && !strTreeHasDS) || !onLoad)
                        {
                            if (isMacro)
                            {
                                if (main.modelParallelFillMode) main.FillModelParallel(typename, typeid, contextId, macroid, true, !lazyLoading, macroTypeFilters, true, DS, sw);
                                else main.FillModelSeq(typename, typeid, contextId, macroid, true, !lazyLoading, macroTypeFilters, true, DS, sw);
                            }
                            else main.LoadAndFillMacroType(name, contextId, true);
                        }
                    }

                    if (sw.CancellationPending) w.Cancel = true;
                };

                wk.ProgressChanged += (s, w) =>
                {
                    if (Disposing || IsDisposed) (s as BackgroundWorker).CancelAsync();
                    else
                    {
                        if ((int)w.UserState == 1) pb.Increment(1);
                        else pb.Value = pb.Maximum;
                    }
                };

                wk.RunWorkerCompleted += (s, w) =>
                {
                    if (w.Cancelled) MessageBox.Show("Возможно не все данные были загружены. Пользователь остановил загрузку данных.");
                    if (w.Error != null) MessageBox.Show("Ошибка при загрузке данных - " + w.Error.Message);

                    if (!Disposing && !IsDisposed)
                    {
                        if (DS.Tables[typename].ExtendedProperties.ContainsKey("Where")) DS.Tables[typename].ExtendedProperties["Where"] = baseWhere;

                        if (DS.Tables[typename].ExtendedProperties.ContainsKey("WhereFC")) DS.Tables[typename].ExtendedProperties.Remove("WhereFC");

                        main.HandleMacroEvents(contextId, "После загрузки");

                        if (mainWindowIsTree) fc.FilterString = LCGforFilter.Text == "LCGforFilter" ? "" : LCGforFilter.Text;

                        if (main.synchViewWithOwnerMacroType && this.Owner != null && this.Owner is EnterResource && main.IsView(main.GetTypeIDByМаcrоTypeID(macroid))) SynchAfterRefresh();

                        if (!main.isolatedDataCacheForMacroType)
                        {
                            main.loadingCtxs.Remove(contextId);
                            if (main.loadingCtxs.Count == 0) main.RaiseListChangedEvents();
                        }
                        else main.RaiseListChangedEvents(contextId);
                        main.RestoreState(dic);

                        comboBox1.Enabled = true;
                        bindingNavigator1.Enabled = true;
                        layoutControl1.Enabled = true;

                        notLookup = false;

                        loading = false;

                        if (findrec != Guid.Empty)
                        {
                            if (!mainWindowIsTree || asGrid) (gridControl1.DataSource as BindingSource).Position = (gridControl1.DataSource as BindingSource).Find("ИД", findrec);
                            else (treeList1.DataSource as BindingSource).Position = (treeList1.DataSource as BindingSource).Find("ИД", findrec);
                        }
                        else
                        {
                            if (!mainWindowIsTree || asGrid)
                            {
                                if (gridControl1.MainView != null) (gridControl1.MainView as ColumnView).MoveFirst();
                            }
                            else treeList1.MoveFirst();
                        }

                        if (lazyLoading) ReSetRootRowPosition();
                        main.SetChildPositionToFirstRow(this, typename);

                        main.LookUpForForm(this, false);

                        SetEditMode();

                        GantArea();

                        pb.Visible = false;

                        isBusy = false;
                    }
                };
            }
            else
            {
                if (wk.IsBusy)
                {
                    while (wk.IsBusy) Application.DoEvents();
                }
            }

            wk.RunWorkerAsync();
...
Рейтинг: 0 / 0
C# async... await
    #39572379
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>ViPRos, сегодня, 23:51 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1280515&msg=21047260][21047260]
>...делай через бакгроундворкер
Это уже проходил.
Я получил то, что мне надо, но не знаю почему.
...
Рейтинг: 0 / 0
C# async... await
    #39572380
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

второй вариант просто работает другой поток, потому рисует основной поток
...
Рейтинг: 0 / 0
C# async... await
    #39572382
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>ViPRos, сегодня, 00:00 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1280515&msg=21047280][21047280]
>второй вариант просто работает другой поток, потому рисует основной поток
Меня смутило, что это не работает:
Код: c#
1.
2.
      var t = Task.Run(() => ShowThreadInfo("Task") );
      t.Wait();
...
Рейтинг: 0 / 0
C# async... await
    #39572385
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев>ViPRos, сегодня, 00:00 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1280515&msg=21047280][21047280]
>второй вариант просто работает другой поток, потому рисует основной поток
Меня смутило, что это не работает:
Код: c#
1.
2.
      var t = Task.Run(() => ShowThreadInfo("Task") );
      t.Wait();



ты же это скопировал отсюда? почему н еработает
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
using System;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      ShowThreadInfo("Application");

      var t = Task.Run(() => ShowThreadInfo("Task") );
      t.Wait();
   }

   static void ShowThreadInfo(String s)
   {
      Console.WriteLine("{0} Thread ID: {1}",
                        s, Thread.CurrentThread.ManagedThreadId);
   }
}
// The example displays the following output:
//       Application thread ID: 1
//       Task thread ID: 3
...
Рейтинг: 0 / 0
C# async... await
    #39572389
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что бы твой метод был асинхронной и использовать await и т.д. надо что бы он был типа этого

!!!TaskCompletionSource!!!


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public static Task RunAsync(Action action) 
{ 
    var tcs = new TaskCompletionSource<Object>(); 
    ThreadPool.QueueUserWorkItem(_ => 
    { 
        try 
        { 
            action(); 
            tcs.SetResult(null); 
        } 
        catch(Exception exc) { tcs.SetException(exc); } 
    }); 
    return tcs.Task; 
}
...
Рейтинг: 0 / 0
C# async... await
    #39572394
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот нашел для тебя хороший учебник


На этот случай предусмотрен класс TaskCompletionSource<T>, позволяющий создать задачу Task, которой вы управляете как марионеткой. Вы можете в любой момент сделать эту задачу успешно завершившейся. Или записать в нее исключение и тем самым сказать, что она завершилась с ошибкой. Рассмотрим пример. Предположим, требуется инкапсулировать показываемый пользователю вопрос в следующем методе: Task<bool> GetUserPermission() Вопрос представляет собой написанный вами диалог, в котором у пользователя запрашивается какое-то разрешение. Поскольку запрашивать разрешение нужно в разных местах приложения, важно, чтобы метод было просто вызывать. Идеальная ситуация для использования асинхронного метода, так как мы не хотим, чтобы этот диалог отображался в потоке пользовательского интерфейса. Однако этот метод очень далек от традиционных асинхронных методов, в которых
54 Глава 6. Паттерн TAP
производится обращение к сети или еще какая-то длительная операция. В данном случае мы ждем ответа от пользователя. Рассмотрим тело метода. private Task<bool> GetUserPermission() { // Создать объект TaskCompletionSource, чтобы можно было вернуть // задачу-марионетку TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>(); // Создать диалог PermissionDialog dialog = new PermissionDialog(); // Когда пользователь закроет диалог, сделать задачу завершившейся // с помощью метода SetResult dialog.Closed += delegate { tcs.SetResult(dialog.PermissionGranted); }; // Показать диалог на экране dialog.Show(); // Вернуть еще не завершившуюся задачу-марионетку return tcs.Task; } Обратите внимание, что метод не помечен ключевым словом async; мы создаем объект Task вручную и не нуждаемся в помощи компилятора. TaskCompletionSource<bool> создает объект Task и предоставляет к нему доступ через свойство Task. Мы возвращаем этот объект, а позже делаем его завершившимся, вызывая метод SetResult объекта TaskCompletionSource. Поскольку мы следовали паттерну TAP, вызывающая программа может просто ждать разрешения пользователя с помощью await. Код получается весьма элегантным: if (await GetUserPermission()) { .... Вызывает раздражение отсутствие неуниверсальной версии класса TaskCompletionSource<T>. Однако Task<T> – подкласс Task, поэтому его можно использовать всюду, где требуется объект Task. Это в свою очередь означает, что можно воспользоваться классом TaskCompletionSource<T>, и рассматривать объект типа Task<T>, являющийся значением свойства Task, как объект типа Task. Я обычно работаю с конкретизацией TaskCompletionSource<object> и для ее заполнения вызываю SetResult(null). При желании нетрудно создать неуниверсальную версию TaskCompletionSource, основываясь на универсальной
...
Рейтинг: 0 / 0
C# async... await
    #39572395
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Асинхронное программирование в C# 5.0
Алекс Дэвис
53 страница
...
Рейтинг: 0 / 0
25 сообщений из 317, страница 1 из 13
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# async... await
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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