powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / async / await and exception handling
51 сообщений из 51, показаны все 3 страниц
async / await and exception handling
    #39392223
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Идея простая, по событию запускаем задачу на пуле задач для обработки действия. Пользователю показываю модалный диалог в котором отображаю прогресс. По завершению процесса закрываю диалог и выполнение идют дальше.
Пытаюсь пременить async/await для разбиение поцесса на части.
Вот что получается пока:
Код: 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.
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                using (var dialog = new FormDialog())
                {
                    var task = DoItNowAsync(dialog);
                    dialog.ShowDialog(this);
                    task.Wait();     // It dosn't work as expected
                    // await task;   // May be so? But it not intension
                }
            }
            catch (Exception ex)
            {
                textBox1.Text = e.ToString();
            }
        }

        private async Task DoItNowAsync(Form dialog)
        {
            await Task.Run(() => { 
                Thread.Sleep(2000);
                throw new ApplicationException("Yep!");
                return true;
            });
            dialog.DialogResult = DialogResult.OK;
        }
    }



Что не получается: если во время обработки процесса происходит исключение то я хочу его обрабатывать в наружнем метчоде, (том, который вызывает async метод).
Пока получается только "Unhandled Exception"
Подскаычите, куда смотрет.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392248
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,
смотрел на ютубе уроки по C#
https://www.youtube.com/channel/UCmdZlsCXz57nazOdp_o5wAg
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392253
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

button1_Click должен быть async:

Код: c#
1.
private async void button1_Click(object sender, EventArgs e)



и тогда можно будет просто сделать

Код: c#
1.
await DoItNowAsync(dialog);



без task и Wait. И тогда получишь своё исключение.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392280
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использовать Tread.Sleep() в тасках ПЛОХАЯ идея! используйте await Task.Delay(ms) или Task.Delay(ms).Wait();
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392286
Т-Миронов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
        private async Task DoItNowAsync(Form dialog)
        {
try{
            await Task.Run(() => { 
                Thread.Sleep(2000);
                throw new ApplicationException("Yep!");
                return true;
            });
}
catch{}
            dialog.DialogResult = DialogResult.OK;
        }
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392379
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttmikron,

button1_Click должен быть async:

Код: c#
1.
private async void button1_Click(object sender, EventArgs e)



и тогда можно будет просто сделать

Код: c#
1.
await DoItNowAsync(dialog);



без task и Wait. И тогда получишь своё исключение.
Так делать нельзя. В принципе конечно можно, но работать будет не так как надо.
Когда по твоему выполнится dialog.ShowDialog(this);
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392381
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesИспользовать Tread.Sleep() в тасках ПЛОХАЯ идея! используйте await Task.Delay(ms) или Task.Delay(ms).Wait();
Тут ежу понатно, что sleep только для демонстрации.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392392
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronТак делать нельзя. В принципе конечно можно, но работать будет не так как надо.
Когда по твоему выполнится dialog.ShowDialog(this);

Код: c#
1.
2.
3.
4.
5.
6.
7.
public static async Task<DialogResult> ShowDialogAsync(this Form @this)
        {
            await Task.Yield();
            if (@this.IsDisposed)
                return DialogResult.OK;
            return @this.ShowDialog();
        }
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392405
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttmikronТак делать нельзя. В принципе конечно можно, но работать будет не так как надо.
Когда по твоему выполнится dialog.ShowDialog(this);

Код: c#
1.
2.
3.
4.
5.
6.
7.
public static async Task<DialogResult> ShowDialogAsync(this Form @this)
        {
            await Task.Yield();
            if (@this.IsDisposed)
                return DialogResult.OK;
            return @this.ShowDialog();
        }


А это тут причем? Куда это вставлять?
Идею не понял. Или я дурак или идея глупая.
Приведи пример кода (или мой кусок исправь)
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392414
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronА это тут причем? Куда это вставлять?

Что тут непонятного?

dialog.ShowDialogAsync()
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392419
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttmikronТак делать нельзя. В принципе конечно можно, но работать будет не так как надо.
Когда по твоему выполнится dialog.ShowDialog(this);

Код: c#
1.
2.
3.
4.
5.
6.
7.
public static async Task<DialogResult> ShowDialogAsync(this Form @this)
        {
            await Task.Yield();
            if (@this.IsDisposed)
                return DialogResult.OK;
            return @this.ShowDialog();
        }


Kак работает async ты не понимаеш. Не растраивайся, нас милион.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392422
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttmikronА это тут причем? Куда это вставлять?

Что тут непонятного?

dialog.ShowDialogAsync()

Просто заменить одну строчку dialog.ShowDialog(this)? Получим блокировку.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392436
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronKак работает async ты не понимаеш. Не растраивайся, нас милион.
mikronПросто заменить одну строчку dialog.ShowDialog(this)? Получим блокировку.

Давненько не работал с WinForms, но я был бы очень рад, если ты пояснишь свою мысль.
Возможно я ошибаюсь.

Можно ещё через Dispatcher решить задачу.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392505
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>mikron, сегодня, 16:02 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1247548&msg=20149979] [20149979]

>Идея простая, по событию запускаем задачу ...

Ситуация аналогичная - построение выборки с Oracle больше минуты, в интерактивном-то приложении. Полный облом. Надо заполнить ожидание. Подошел такой вариант - демонстратор процесса ожидания есть вращающийся земной шарик и прогрессбар.
В одном пользовательском приложении: смысловое приложение - WinForm, демонстратор - WPF.

Поступил так:

Код: 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.
    //-- Демонстратор процесса ожидания получения данных
    private void f_Start() {
      prc_Ожидание = new Process();
      prc_Ожидание.StartInfo.FileName = гп.pth_Решения + @"\wpf_Ожидание.exe";
      prc_Ожидание.StartInfo.Arguments = "40"; //-- примерное время построения выборки + гак
      prc_Ожидание.Start();
    }

    private void btn_Продолжим_Click(object sender, EventArgs e) {
      //-- Дата в имени формы
      гп.оПребываниеТБ.dt_Пребывание= dtp_Пребывание.Value;

      //-- Запускаем в параллельном режиме формирование выборки
      this.WindowState = FormWindowState.Minimized;
      //await Task.Run(new Action(f_Выборка));
      var tk_v = Task.Run(() => f_Выборка());

      //-- Запустим демонстратор процесса ожидания получения данных
      //var tk_s = Task.Run(() => f_Start());
      f_Start();

      //-- Ожидаем завершение построения выборки
      tk_v.Wait();

      //-- Остановим демонстратор процесса получения данных
      foreach (Process clsProcess in Process.GetProcesses())
        if (clsProcess.ProcessName == "wpf_Ожидание") prc_Ожидание.Kill();
      if (prc_Ожидание != null) {
        prc_Ожидание.Dispose();
        prc_Ожидание.Close();
        prc_Ожидание = null;
      }

      this.Dispose();
      this.Close();
    }



С уважением,
Владимир
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392506
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

Думаю, с await здесь не прокатит. По старинке (Task.ContinueWith) не подходит?
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392593
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttmikronKак работает async ты не понимаеш. Не растраивайся, нас милион.
mikronПросто заменить одну строчку dialog.ShowDialog(this)? Получим блокировку.

Давненько не работал с WinForms, но я был бы очень рад, если ты пояснишь свою мысль.

В DoItNowAsync после успешного завершения await необходимо переключение контекста (SynchrinisationConext)
но для этого необходимо что-бы запустился message pump.
В моей реализации это достигается dialog.ShowDialog(this);
В твоей реализации этого никогда не произойдёт т.к. поток просто встанет в task.Wait();
И твой this.ShowDialog() из ShowDialogAsync тоже никда не запустится, по той-же причине.

Просто проверь, код же ест.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392620
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>mikron, сегодня, 00:08 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1247548&msg=20151610] [20151610]
>...В моей реализации это достигается dialog.ShowDialog(this)...

Вы рассматривали граничный вариант? Проходит?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
        private async Task DoItNowAsync(Form dialog)   {
            await Task.Run(() => { 
                //--!! Thread.Sleep(2000);
                throw new ApplicationException("Yep!");
                return true;
            });
            dialog.DialogResult = DialogResult.OK;
        }



С уважением,
Владимир
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392695
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronПросто проверь, код же ес

Я не поленился, и проверил.

Картинка и код:

Код: 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.
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            try
            {
                using (var dialog = new FormDialog())
                {
                    var showDialogTask = dialog.ShowDialogAsync();
                    await DoItNowAsync();
                    await showDialogTask;
                }
            }
            catch (Exception ex)
            {
                textBox1.Text = ex.ToString();
            } 
        }

        private async Task DoItNowAsync()
        {
            await Task.Run(() => {
                Thread.Sleep(2000);
                throw new ApplicationException("Yep!");
                return true;
            });
        }
    }

    public static class SomeExtensions
    {
        public static async Task<DialogResult> ShowDialogAsync(this Form @this)
        {
            await Task.Yield();
            if (@this.IsDisposed)
                return DialogResult.OK;
            return @this.ShowDialog();
        }
    }
}
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392696
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronВ DoItNowAsync после успешного завершения await необходимо переключение контекста (SynchrinisationConext)
но для этого необходимо что-бы запустился message pump.
В моей реализации это достигается dialog.ShowDialog(this);
В твоей реализации этого никогда не произойдёт т.к. поток просто встанет в task.Wait();
И твой this.ShowDialog() из ShowDialogAsync тоже никда не запустится, по той-же причине.

Ты какие-то нелепейшие глупости говоришь.
У меня всё работает, я изначально привёл тебе решение, но ты даже не стал проверять.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392773
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttmikronВ DoItNowAsync после успешного завершения await необходимо переключение контекста (SynchrinisationConext)
но для этого необходимо что-бы запустился message pump.
В моей реализации это достигается dialog.ShowDialog(this);
В твоей реализации этого никогда не произойдёт т.к. поток просто встанет в task.Wait();
И твой this.ShowDialog() из ShowDialogAsync тоже никда не запустится, по той-же причине.

Ты какие-то нелепейшие глупости говоришь.
У меня всё работает, я изначально привёл тебе решение, но ты даже не стал проверять.
Ты просил обяснить, но видно не в состоянии понять. Начнём с первого предложения, не пропуская слов.
mikronВ DoItNowAsync после успешного завершения await необходимо переключение контекста (SynchrinisationConext)
Переводу на доступный - закомнитруй выброс исключения.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392788
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronmikronВ DoItNowAsync после успешного завершения await необходимо переключение контекста (SynchrinisationConext)
Переводу на доступный - закомнитруй выброс исключения.

Я всё равно не понимаю, что ты хочешь сказать и к чему ведёшь.

Вот твой изначальный вопрос:

mikronЧто не получается: если во время обработки процесса происходит исключение то я хочу его обрабатывать в наружнем метчоде, (том, который вызывает async метод).
Пока получается только "Unhandled Exception"
Подскаычите, куда смотрет.

Я тебе выше привёл полное решение, в котором твоё исключение попадает в «наружний метод» в чистом виде.

Если мне не веришь, скопируй код, который я тебе привёл и выполни. Увидишь отлов своего исключения.

Тем более ты мне что-то говорил, что это работать не будет, что будет какая-то блокировка — это не правда. Всё работает, никаких блокировок.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392798
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Стоп, только сейчас заметил, ты изменил метод DoItNowAsync, убрал присваивание dialogResult. Посмотрю позже.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392821
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttmikronА это тут причем? Куда это вставлять?

Что тут непонятного?

dialog.ShowDialogAsync()

Я не люблю головоломок из области найди отличия
Код: 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.
1. 
private void button1_Click(object sender, EventArgs e)
vs.
private async void button1_Click(object sender, EventArgs e)

2.
                    var task = DoItNowAsync(dialog);
                    dialog.ShowDialog(this);
                    task.Wait();     // It dosn't work as expected
 vs.
                    var showDialogTask = dialog.ShowDialogAsync();
                    await DoItNowAsync();
                    await showDialogTask;

3.
 private async Task DoItNowAsync(Form dialog)
        {
            await Task.Run(() => { 
                Thread.Sleep(2000);
                throw new ApplicationException("Yep!");
                return true;
            });
            dialog.DialogResult = DialogResult.OK;
        }
vs.
private async Task DoItNowAsync()
        {
            await Task.Run(() => {
                Thread.Sleep(2000);
                throw new ApplicationException("Yep!");
                return true;
            });
        }
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392826
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronhVostt,

Стоп, только сейчас заметил, ты изменил метод DoItNowAsync, убрал присваивание dialogResult. Посмотрю позже.

Форма диалога должна сама устанавливать значение этого свойства и возвращать результат, установка этого свойства внешним кодом это жутковатый грубый костыль. Конечно я снёс это безобразие.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392828
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronЯ не люблю головоломок из области найди отличия

Обо всех отличиях было сказано выше, про async и метод расширения, про то, что task.Wait надо убрать я тоже писал. Не люблю повторяться, просто применил всё, что было сказано.

Про присваивание диалогу значения свойства, тоже написал, но можно и присвоить если очень хочется.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392849
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttmikronЯ не люблю головоломок из области найди отличия

Обо всех отличиях было сказано выше, про async и метод расширения, про то, что task.Wait надо убрать я тоже писал. Не люблю повторяться, просто применил всё, что было сказано.

Про присваивание диалогу значения свойства, тоже написал, но можно и присвоить если очень хочется.

Я ещё не доконца разобрался как работает то что ты набросал, но есть замечания.
1. Убери исключение - диалог не закрывается после асинхронной обработки (слип).
Другое поведение.

2. Я уже сказал, по поводу
private async void button1_Click
Так делать нельзя. В принципе конечно можно, но работать будет не так как надо.
Другими словами, не приемлемо для меня. В примере я повесил это на обработчик события, в реалной жизни это синхронный метод, его менять нельзя, его завершения ждут.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392854
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron1. Убери исключение - диалог не закрывается после асинхронной обработки (слип).
Другое поведение.

Убрал. Закрывается.



mikron2. Я уже сказал, по поводу
private async void button1_Click
Так делать нельзя. В принципе конечно можно, но работать будет не так как надо.
Другими словами, не приемлемо для меня. В примере я повесил это на обработчик события, в реалной жизни это синхронный метод, его менять нельзя, его завершения ждут.

Если обработчик кнопки вызывает асинхронную операцию, то делать не просто можно, так делать нужно!

Может ты путаешь параллельные операции, которые надо исполнять в BackgroundWorker и асинхронные?
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392879
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttmikron1. Убери исключение - диалог не закрывается после асинхронной обработки (слип).
Другое поведение.

Убрал. Закрывается.

Давай угадаю, опят добавил
dialog.DialogResult = DialogResult.OK;
но умолчал

hVosttmikron2. Я уже сказал, по поводу
private async void button1_Click
Так делать нельзя. В принципе конечно можно, но работать будет не так как надо.
Другими словами, не приемлемо для меня. В примере я повесил это на обработчик события, в реалной жизни это синхронный метод, его менять нельзя, его завершения ждут.

Если обработчик кнопки вызывает асинхронную операцию, то делать не просто можно, так делать нужно!

Может ты путаешь параллельные операции, которые надо исполнять в BackgroundWorker и асинхронные?
Еще раз:
в тестовом примере есть кнопка, в реалной проблеме нету кнопки.
В тестовом примере метод называется
... button1_Click(object sender, EventArgs e)
в реалной проблеме метод называется
void makeSomeFunnyStuff()


Еще раз:
в тестовом примере есть кнопка, в реальной проблеме нету кнопки.
В тестовом примере метод называется
button1_Click(object sender, EventArgs e)
в реальной проблеме метод называется
void makeSomeFunnyStuff()
и в реалной проблеме метод должен быть синхронным.. Просто прими как ограничение.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392918
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>mikron, сегодня, 00:08 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1247548&msg=20151610] [20151610]

>...И твой this.ShowDialog() из ShowDialogAsync...

Посмотри здесь .

С уважением,
Владимир
...
Рейтинг: 0 / 0
async / await and exception handling
    #39392975
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronи в реалной проблеме метод должен быть синхронным.. Просто прими как ограничение.

Ну выполняй код тогда синхронно, без тасков и асинков.

В общем, я решение дал. Оно работает. Поставленную задачу в начале топика решает. Чего ты хочешь мне сообщить, я категорически не понимаю, поэтому умываю руки.

Решай сам, что тебе нужно.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393026
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttmikronи в реалной проблеме метод должен быть синхронным.. Просто прими как ограничение.

Ну выполняй код тогда синхронно, без тасков и асинков.

В общем, я решение дал. Оно работает. Поставленную задачу в начале топика решает. Чего ты хочешь мне сообщить, я категорически не понимаю, поэтому умываю руки.

Решай сам, что тебе нужно.
Да не, я истины ради. Ты решил не мою задачу а похожую. Хороший спаринг партнёр нужен, иначе я застрял.

mikronИдея простая, по событию запускаем задачу на пуле задач для обработки действия. Пользователю показываю модалный диалог в котором отображаю прогресс. По завершению процесса закрываю диалог и выполнение идeт дальше. (синхронно)
Пытаюсь пременить async/await для разбиение поцесса на части.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393047
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronДа не, я истины ради. Ты решил не мою задачу а похожую. Хороший спаринг партнёр нужен, иначе я застрял.

Ну покажи проблему? У меня пока ни затыков, ни блокировок, всё работает :) Что сделать надо, чтобы всё сломалось?
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393078
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Код: c#
1.
private void button1_Click(object sender, EventArgs e)
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393198
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

в асинхронном алгоритме должно быть два метода:
1) запускаем задачу и выходим.
2) обрабатываем завершение задачи.

Разложи свою задачу на два независимых метода. (У меня не получается разложить ее: из-за ShowDialog нельзя выйти из 1-го метода)

async/await просто помогают два метода соединить в один...
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393261
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Вот так уже не работатет
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
        private async Task DoItNowAsync(Form dialog)
        {
            await Task.Run(() => { 
                // Thread.Sleep(2000);
                // throw new ApplicationException("Yep!");
                return true;
            });
            dialog.DialogResult = DialogResult.OK;
        }
    }

    public static class SomeExtensions
    {
        public static async Task<DialogResult> ShowDialogAsync(this Form @this)
        {
            await Task.Yield();   // !
            await Task.Yield();
            if (@this.IsDisposed)
                return DialogResult.OK;
            return @this.ShowDialog();
        }
    }


Но это же детали.

А вобще вопрос снимается т.к. в данном случае код который я привёл работатет как и ожидается, но повидение Студии странное: появляется окно о необработаном исклюцении и в последствии task.Wait как и ожидатется пробрасывает исключение.
Одно допонение.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
        private async Task DoItNowAsync(Form dialog)
        {
            try
            {
                await Task.Run(() =>
                {
                    Thread.Sleep(2000);
                    throw new ApplicationException("Yep!");
                    return true;
                });
            }
            finally
            {
                dialog.DialogResult = DialogResult.OK;
            }
        }
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393319
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronА вобще вопрос снимается т.к. в данном случае код который я привёл работатет как и ожидается, но повидение Студии странное: появляется окно о необработаном исклюцении и в последствии task.Wait как и ожидатется пробрасывает исключение.
Одно допонение.

Мне кажется, я даже уверен, ты используешь таски не по назначению.

mikron
Код: c#
1.
private async void button1_Click(object sender, EventArgs e)



Вот так правильно, если ты обрабатываешь асинхронную операцию. Не вериш? Можешь поспорить напрямую с разработчиками Microsoft, наверняка там сидят не далёкие люди
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393383
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttВот так правильно, если ты обрабатываешь асинхронную операцию.

С чего ты решил что моя операция асинхронна - не пойму. Я ещё раз повторю - мне надо синхронно.
И какие бы высоколобые люди в микрософте не сидели - они тоже не святые и от ошибок не обережены.

Страдая дальше вот чего получил.

Код: 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.
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                using (var dialog = new FormDialog())
                {
                    var task = Task.Run(() =>
                    {
                        Thread.Sleep(4000);
                        throw new ApplicationException("Yep!");
                        return true;
                    });
                    Task.WaitAny(task, Task.Delay(1000));   // This delay is required to prevent flickering (opening and closing dialog for a short operation)
                    if (!task.IsCompleted)
                    {
                        task.ContinueWith((_) => 
                            { 
                                dialog.DialogResult = DialogResult.OK; 
                            });
                        dialog.ShowDialog(this);
                        task.Wait();
                    }
                }
            }
            catch (Exception ex)
            {
                textBox1.Text = ex.ToString();
            }
        }
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393403
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronС чего ты решил что моя операция асинхронна - не пойму. Я ещё раз повторю - мне надо синхронно.

Зачем синхронную операцию пытаться выполнить асинхронно? Ты бы как-то реальную задачу обозначил, чего ты пытаешься сделать, а не синтетические примеры с тасками и слипами.

mikronИ какие бы высоколобые люди в микрософте не сидели - они тоже не святые и от ошибок не обережены.

А по-конкретнее? Нашёл какие-то ошибки?


mikronСтрадая дальше вот чего получил.

Можешь сказать, зачем ты вообще пихаешь сюда Task.Run? Для чего?
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393416
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttmikronС чего ты решил что моя операция асинхронна - не пойму. Я ещё раз повторю - мне надо синхронно.

Зачем синхронную операцию пытаться выполнить асинхронно? Ты бы как-то реальную задачу обозначил, чего ты пытаешься сделать, а не синтетические примеры с тасками и слипами.


Операция синхронна, но надо дать пользователю информацию что программа не подвисла а какй-нибудь прогросс идикатор.
20107068



hVosttmikronИ какие бы высоколобые люди в микрософте не сидели - они тоже не святые и от ошибок не обережены.
А по-конкретнее? Нашёл какие-то ошибки?

Ты аргументировал свой позицию не фактами а авторитетом. Это указание на несостоятелность аргумента.
20154452


hVosttМожешь сказать, зачем ты вообще пихаешь сюда Task.Run? Для чего?
Очевидно, запись файла операция не быстрая. Вобще всё это описал в первом посте
mikronИдея простая, по событию запускаем задачу на пуле задач для обработки действия. Пользователю показываю модалный диалог в котором отображаю прогресс. По завершению процесса закрываю диалог и выполнение идют дальше.

Есть идея лутше?
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393420
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronЕсть идея лутше?
Может, не мучиться, и сделать всё вышеописанное с помощью BackgroundWorker'а? (всё равно ведь винформс).
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393427
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronОперация синхронна, но надо дать пользователю информацию что программа не подвисла а какй-нибудь прогросс идикатор.

В чём проблема:

а) сначала показать диалог, затем запустить операцию
б) запустить операцию в BackgroundWorker и показывать прогресс бар?

Задача стара как мир, за каким дедушкой, объясни мне пожалуйста, тут понадобились таски?
Уже который раз задаю один и тот же вопрос.

mikronТы аргументировал свой позицию не фактами а авторитетом. Это указание на несостоятелность аргумента.

Не авторитетом, а первоисточником. Ты перепутал эти понятия и сделал неправильные выводы.


mikronОчевидно, запись файла операция не быстрая. Вобще всё это описал в первом посте

Запись файла — асинхронная операция. Но судя по всему, раз ты даже таких элементарных вещей не знаешь, о чём мы вообще тогда разговариваем? Если для тебя документация Microsoft «не авторитет», видимо поэтому ты не знаешь таких вещей.

В общем, всё ясно.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393429
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныmikronЕсть идея лутше?
Может, не мучиться, и сделать всё вышеописанное с помощью BackgroundWorker'а? (всё равно ведь винформс).

К сожалению, бэкграунд воркер это унылое поделие какой-то авторитетной шишки, ей доверять нельзя, надо всё делать наоборот
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393499
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttmikronОперация синхронна, но надо дать пользователю информацию что программа не подвисла а какй-нибудь прогросс идикатор.

В чём проблема:

а) сначала показать диалог, затем запустить операцию
б) запустить операцию в BackgroundWorker и показывать прогресс бар?

Задача стара как мир, за каким дедушкой, объясни мне пожалуйста, тут понадобились таски?
Уже который раз задаю один и тот же вопрос.

Что то совсем плох стал. Вопрос задаёшь второй раз. Я надеялся ответ очевиден, но видно за отсутствием опыта не для тебя.
Ответ: решение моей задачи элегантно, эффективно, компактно.
Для проверки: Повтори моё решение предложным тобой методом. Посчитай количество строчек кода. выложи сюда и мы вместе сравним.

hVosttmikronТы аргументировал свой позицию не фактами а авторитетом. Это указание на несостоятелность аргумента.

Не авторитетом, а первоисточником. Ты перепутал эти понятия и сделал неправильные выводы.


Любая попытка аргументировать ссылкой на мнения других людей говорит только о том что своих аргументов у тебя уже нет.
Аргумент опять глупый: первоисточники утверждали земля круглая.


hVosttmikronОчевидно, запись файла операция не быстрая. Вобще всё это описал в первом посте

Запись файла — асинхронная операция. Но судя по всему, раз ты даже таких элементарных вещей не знаешь, о чём мы вообще тогда разговариваем? Если для тебя документация Microsoft «не авторитет», видимо поэтому ты не знаешь таких вещей.

Это чушь, ты и сам догадываешся наверно.

Ты пытаешься обвинить меня в некомпетентности и дискредитировать как оппонента.
Это показывает снова отсутсвие аргументов по делу и делает тебя только крикуном.
Это не мой уровень. Хочешь продолжит дискусию, давай по теме. Повтори решение предложным тобой методом.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393519
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

mikron,

И все-таки ContinueWith
а то async... await...

ЗЫ. Зачeм Тask.Wait? Задача в твоем коде будет гарантировано завершена. На всякий случай?
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393527
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregmikron,

mikron,

И все-таки ContinueWith
а то async... await...

ЗЫ. Зачeм Тask.Wait? Задача в твоем коде будет гарантировано завершена. На всякий случай?
Получается так. Тask.Wait нужен для проброса исключения.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393537
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronЭто чушь, ты и сам догадываешся наверно.

Мда. Не вижу смысла дискутировать с человеком, не знающим самых элементарных вещей, а учить мне тебя нет желания.


mikronЭто не мой уровень. Хочешь продолжит дискусию, давай по теме. Повтори решение предложным тобой методом.

Мне зачем это? Твоя задача, я тебе дал рабочее решение. Дальше сам борись со своими тараканами.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393540
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronЛюбая попытка аргументировать ссылкой на мнения других людей говорит только о том что своих аргументов у тебя уже нет.
Аргумент опять глупый: первоисточники утверждали земля круглая.

Просто невероятной тупизны ахинея.
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393552
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronПолучается так. Тask.Wait нужен для проброса исключения.Ясно. Но обработку вроде логичнее делать именно в ContinueWith коде. Там для этого спец.механизмы есть.
Получается что исключение произошло, и мы ждем закрытия диалогового окна, что бы его пробросить.
Ну, пусть так... Сделаем скидку, что пример для демонстрации
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393554
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>mikron, сегодня, 18:11 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1247548&msg=20154719][20154719]
>...Страдая дальше вот чего получил...

А если так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
    private void button1_Click(object sender, EventArgs e)    {
      fAsync();
    }
    private void fAsync() {
        FormDialog dialog = new FormDialog();   
        BeginInvoke((Action)(() => dialog.ShowDialog(this)));
        
        //await Task.Run(new Action(fTask));
        var task = Task.Run<string>(() => fTask());
        task.Wait();
        dialog.Close();
      
      //-- task.Rezult
      //-- switch
      . . . 
    }
    private string fTask() {
       Thread.Sleep(4000);
       return "Yep!";
    }



Не знаю смысла задачи и не совсем понимаю зачем:
throw new ApplicationException("Yep!");

С уважением,
Владимир
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393679
romangr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron, Если я правильно понял, нужно это:
Код: 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.
        
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                using (var dialog = new DialogForm())
                {
                    var task = RunLengthyAction(dialog);
                    dialog.ShowDialog(this);
                    task.Wait();
                }
            }
            catch (Exception ex)
            {
                textBox1.Text = ex.ToString();
            }
        }

        private Task RunLengthyAction(Form dialog)
        {
            return Task.Run(() =>
            {
                try
                {
                    // some lengthy operation
                    Thread.Sleep(3000);
                    throw new InvalidOperationException();
                }
                finally
                {
                    // BeginInvoke, because of showdialog has its own message loop
                    BeginInvoke((Action) (() => {
                        dialog.DialogResult = DialogResult.OK;
                    }));
                }
            });
        }
...
Рейтинг: 0 / 0
async / await and exception handling
    #39393735
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>mikron, вчера, 21:53 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1247548&msg=20155414][20155414]
>Получается так. Тask.Wait нужен для проброса исключения.

Посмотри на это .

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


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