Информация об изменениях

Сообщение Re[12]: [.NET][async][WinForms] от 24.12.2016 19:39

Изменено 25.12.2016 17:43 Serginio1

Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:


S>> Так я тебе в твоем примере и привел, когда при вызове RunAsync внутри ты будешь не будешь использовать ConfigureAwait(false)

S>>Просто ты не читаешь.

S>Скорее наоборот Цитато:

S>

S>проблема там не в ConfigureAwait(), а в исчерпании потоков, доступных для запуска продолжений

S>Код await RunAsync().Wait(); именно это и делает — блокирует все доступные потоки (их одна штука). Вот тебе другой пример того же поведения:

Еще раз. Я в 1С использую Контекст Синхронизации для получения ком событий в потоке GUI 1c.
S>
S>using System;
S>using System.Threading;
S>using System.Threading.Tasks;

S>namespace ConsoleApp3
S>{
S>    class Program
S>    {
S>        static void Main(string[] args)
S>        {
S>            ThreadPool.SetMinThreads(1, 1);
S>            ThreadPool.SetMaxThreads(8, 8);
S>            // ...
S>            RunAsync(10).Wait();
S>            Console.WriteLine(total);
S>        }

S>        private static volatile int total = 0;

S>        private static async Task RunAsync(int i)
S>        {
S>            if (i == 0)
S>                return;

S>            Console.WriteLine(i);
S>            await Task.Delay(1).ConfigureAwait(false);
S>            RunAsync(i - 1).Wait();
S>            Interlocked.Increment(ref total);
S>        }
S>    }
S>}
S>


S>Ну как, помог ConfigureAwait(false)?


Вот такого выделенного я в 1С не могу сделать, а в вот вместо выделенного в библиотеке
await RunAsync(i - 1).Wait;


легко
S>Надеюсь, теперь понятно, про что уже четыре человека в топике пытаются тебе намекнуть: не надо лечить симптомы, не разобравшись с болезнью.

Я уже 1000+1 раз объяснил свою проблему в 1С. Но Вы не слушаете. Огромное спасибо за ConfigureAwait.Fody
Еще раз не везде можно использовать await, но можно использовать WindowsFormsSynchronizationContext и для получения результата использовать методы синхронизации.
Мне это нужно, а вам нет. Но это не значит, что проблемы не существует.

Еще раз дам ссылочки

.NET(C#) для 1С. Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия

А вот при использовании напрbмер HTTPClient можно использовать синхронные методы потому, что в библиотеке все методы .ConfigureAwait(false);

Но вот могут попасться и библиотек ConfigureAwait по умолчанию.

Использовать асинхронные методы можно, но это не всегда удобно.

Асинхронное программирование в 1С через использование классов .Net из Native ВК

Поэтому, если у Вас не болит, то это не значит, что не болит у всех

Да и в GUI далеко не всегда нужно переключаться на поток GUI. Раньше до await использовали Invoke
delegate void AddTextToTListBox(string text);

        void msg_OnSendChatMessage(string message)
        {
            
            if (listBox1.InvokeRequired)
            {
                AddTextToTextBox d = new AddTextToTextBox(msg_OnSendChatMessage);
                this.Invoke(d, new object[] { message });
            }
            else
            {
                listBox1.Text += message + "\r\n";
            }  
        }


И это было нормально. А вот ConfigureAwait(true) это уже извращение.

Еще раз огромное спасибо за ConfigureAwait.Fody. Это решение всех моих проблем.
Но к сожалению, не решает проблем со сторонними библиотеками где не используют .ConfigureAwait(false);
Re[12]: [.NET][async][WinForms]
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:


S>> Так я тебе в твоем примере и привел, когда при вызове RunAsync внутри ты будешь не будешь использовать ConfigureAwait(false)

S>>Просто ты не читаешь.

S>Скорее наоборот Цитато:

S>

S>проблема там не в ConfigureAwait(), а в исчерпании потоков, доступных для запуска продолжений

S>Код await RunAsync().Wait(); именно это и делает — блокирует все доступные потоки (их одна штука). Вот тебе другой пример того же поведения:

Еще раз. Я в 1С использую Контекст Синхронизации для получения ком событий в потоке GUI 1c.
S>
S>using System;
S>using System.Threading;
S>using System.Threading.Tasks;

S>namespace ConsoleApp3
S>{
S>    class Program
S>    {
S>        static void Main(string[] args)
S>        {
S>            ThreadPool.SetMinThreads(1, 1);
S>            ThreadPool.SetMaxThreads(8, 8);
S>            // ...
S>            RunAsync(10).Wait();
S>            Console.WriteLine(total);
S>        }

S>        private static volatile int total = 0;

S>        private static async Task RunAsync(int i)
S>        {
S>            if (i == 0)
S>                return;

S>            Console.WriteLine(i);
S>            await Task.Delay(1).ConfigureAwait(false);
S>            RunAsync(i - 1).Wait();
S>            Interlocked.Increment(ref total);
S>        }
S>    }
S>}
S>


S>Ну как, помог ConfigureAwait(false)?


Вот такого выделенного я в 1С не могу сделать, а в вот вместо выделенного в библиотеке
await RunAsync(i - 1).Wait;


await RunAsync(i — 1) легко
S>Надеюсь, теперь понятно, про что уже четыре человека в топике пытаются тебе намекнуть: не надо лечить симптомы, не разобравшись с болезнью.

Я уже 1000+1 раз объяснил свою проблему в 1С. Но Вы не слушаете. Огромное спасибо за ConfigureAwait.Fody
Еще раз не везде можно использовать await, но можно использовать WindowsFormsSynchronizationContext и для получения результата использовать методы синхронизации.
Мне это нужно, а вам нет. Но это не значит, что проблемы не существует.

Еще раз дам ссылочки

.NET(C#) для 1С. Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия

А вот при использовании напрbмер HTTPClient можно использовать синхронные методы потому, что в библиотеке все методы .ConfigureAwait(false);

Но вот могут попасться и библиотек ConfigureAwait по умолчанию.

Использовать асинхронные методы можно, но это не всегда удобно.

Асинхронное программирование в 1С через использование классов .Net из Native ВК

Поэтому, если у Вас не болит, то это не значит, что не болит у всех

Да и в GUI далеко не всегда нужно переключаться на поток GUI. Раньше до await использовали Invoke
delegate void AddTextToTListBox(string text);

        void msg_OnSendChatMessage(string message)
        {
            
            if (listBox1.InvokeRequired)
            {
                AddTextToTextBox d = new AddTextToTextBox(msg_OnSendChatMessage);
                this.Invoke(d, new object[] { message });
            }
            else
            {
                listBox1.Text += message + "\r\n";
            }  
        }


И это было нормально. А вот ConfigureAwait(true) это уже извращение.

Еще раз огромное спасибо за ConfigureAwait.Fody. Это решение всех моих проблем.
Но к сожалению, не решает проблем со сторонними библиотеками где не используют .ConfigureAwait(false);