powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / async await что я делаю не так?
67 сообщений из 67, показаны все 3 страниц
async await что я делаю не так?
    #40067771
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
был такой код:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
static void Main(string[] args)
{
    List<Task> tasks = new List<Task>();
    Stopwatch sw = new Stopwatch();
    sw.Start();

    for (int i = 0; i < 100; i++)
    {
        tasks.Add(Task.Factory.StartNew(() =>
        {
        .........

            bytes = stream.Read(data, 0, data.Length);

        .........
        }));
    }
    Task.WaitAll(tasks.ToArray());

    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds);
    Console.ReadLine();
}



Мне нужно было сделать чтение асинхронным, и я переписал так:

Код: 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.
static void Main(string[] args)
{
    List<Task> tasks = new List<Task>();
    Stopwatch sw = new Stopwatch();
    sw.Start();

    for (int i = 0; i < 100; i++)
    {
        tasks.Add(Task.Factory.StartNew(async () =>
        {
            .........

            Task<int> readtask = stream.ReadAsync(data, 0, data.Length);
            await readtask;
            bytes = readtask.Result;

            .........
        }));
    }
    Task.WaitAll(tasks.ToArray());

    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds);
    Console.ReadLine();
}



Задачи работают как нужно, с этим все ок. Hо вот теперь на Task.WaitAll(tasks.ToArray()); программе стало наплевать, сразу переходит к записи времени в консоль. Как это поправить?
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067773
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты все делаешь не так.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067776
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067781
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Честно говоря я не понял что из того, что по ссылке, может помочь.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067782
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
static async Task Main()
{
    Stopwatch sw = new Stopwatch();
    sw.Start();

    await Task.WhenAll(
        Enumerable.Repeat(0, 100)
             .Select(_ => stream.ReadAsync(data, 0, data.Length)));

    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds);
    Console.ReadKey(true);
}
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067787
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

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

Мне нужно опросить 100 устройств, и секунд через 5 они вернут результаты измерений в том же соединении. Но запрос нужно подать одновременно на все, чтоб привязаться ко времени для статистики, графиков и т.п.

Для тестов утащил с метанита клиент - сервер. Сервер (многопоточный) изменил так, чтоб между запросом и ответом была задержка 5 секунд. Клиента сделал создающим собственно 100 задач. (для тестов опрашиваю один сервер 100 раз, а не 100 различных устройств)
Если в клиенте читать синхронно, то на эти пять секунд поток блочится, и пул неспешно обрабатывает все по очереди. Если чтение переделать на асинхронное - то все получается как нужно - уходят сразу 100 запросов, через 5 секунд приходят 100 ответов.

Вот полный код
клиент:

Код: 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.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {

        const int port = 8888;
        const string address = "127.0.0.1";
        static void Main(string[] args)
        {

            List<Task> tasks = new List<Task>();

            Stopwatch sw = new Stopwatch();
            sw.Start();


            for (int i = 0; i < 100; i++)
            {
                int tmp = i;

                tasks.Add(Task.Factory.StartNew(async () =>
               {
                   TcpClient client = null;
                   try
                   {
                       client = new TcpClient(address, port);
                       NetworkStream stream = client.GetStream();

                       string message = $"qwertyuiop {tmp}";
                       // преобразуем сообщение в массив байтов
                       byte[] data = Encoding.Unicode.GetBytes(message);
                       // отправка сообщения
                       stream.Write(data, 0, data.Length);

                       // получаем ответ
                       data = new byte[64]; // буфер для получаемых данных
                       StringBuilder builder = new StringBuilder();
                       int bytes = 0;
                       do
                       {
                           Task<int> readtask = stream.ReadAsync(data, 0, data.Length);
                           await readtask;
                           //bytes = stream.Read(data, 0, data.Length);
                           bytes = readtask.Result;
                           builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                       }
                       while (stream.DataAvailable);

                       message = builder.ToString();
                       Console.WriteLine("Сервер: {0}", message);

                   }
                   catch (Exception ex)
                   {
                       Console.WriteLine(ex.Message);
                   }
                   finally
                   {
                       client.Close();
                   }



               }));
            }
            Task.WaitAll(tasks.ToArray());

            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);
            Console.ReadLine();
        }
    }

}



сервер:

Код: 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.
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace ConsoleServer
{
    public class ClientObject
    {
        public TcpClient client;
        public ClientObject(TcpClient tcpClient)
        {
            client = tcpClient;
        }

        public void Process()
        {
            NetworkStream stream = null;
            try
            {
                stream = client.GetStream();
                byte[] data = new byte[64]; // буфер для получаемых данных

                // получаем сообщение
                StringBuilder builder = new StringBuilder();
                int bytes = 0;
                do
                {
                    bytes = stream.Read(data, 0, data.Length);
                    builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                }
                while (stream.DataAvailable);

                string message = builder.ToString();

                Console.WriteLine(message);
                // отправляем обратно сообщение в верхнем регистре

                Thread.Sleep(5000);

                message = message.Substring(message.IndexOf(':') + 1).Trim().ToUpper();
                data = Encoding.Unicode.GetBytes(message);
                stream.Write(data, 0, data.Length);

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (stream != null)
                    stream.Close();
                if (client != null)
                    client.Close();
            }
        }
    }

    class Program
    {
        const int port = 8888;
        static TcpListener listener;
        static void Main(string[] args)
        {
            try
            {
                listener = new TcpListener(IPAddress.Parse("127.0.0.1"), port);
                listener.Start();
                Console.WriteLine("Ожидание подключений...");

                while (true)
                {
                    TcpClient client = listener.AcceptTcpClient();
                    ClientObject clientObject = new ClientObject(client);

                    // создаем новый поток для обслуживания нового клиента
                    Thread clientThread = new Thread(new ThreadStart(clientObject.Process));
                    clientThread.Start();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (listener != null)
                    listener.Stop();
            }
        }
    }



}

...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067790
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделал вот так. Не знаю правильней так или нет... Кстати заметил что в обоих вариантах что-то не то с циклом приема, если буфер меньше сообщения ерунда получается :(

Код: 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.
using System;
using System.Diagnostics;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        const int port = 8888;
        const string address = "127.0.0.1";
        const int num = 100;
        static void Main(string[] args)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();

            TcpClient[] clients = new TcpClient[num];
            Task[] tsk_write = new Task[num];
            Task<int>[] tsk_read = new Task<int>[num];

            for (int i = 0; i < num; i++)
            {
                int tmp = i;
                try
                {
                    clients[i] = new TcpClient(address, port);
                    NetworkStream stream = clients[i].GetStream();

                    string message = $"qwertyuiop {tmp}";

                    byte[] data = Encoding.Unicode.GetBytes(message);

                    tsk_write[i] = stream.WriteAsync(data, 0, data.Length);

                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
            Task.WhenAll(tsk_write).Wait();

            for (int i = 0; i < num; i++)
            {
                try
                {

                    byte[] data = new byte[64];
                    StringBuilder builder = new StringBuilder();
                    int bytes = 0;
                    do
                    {
                        tsk_read[i] = clients[i].GetStream().ReadAsync(data, 0, data.Length);
                        bytes = tsk_read[i].Result;
                        builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                    }
                    while (clients[i].GetStream().DataAvailable);

                    string message = builder.ToString();
                    Console.WriteLine("Сервер: {0}", message);

                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    clients[i].Close();
                }
            }
            Task.WhenAll(tsk_read).Wait();
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);
            Console.ReadLine();
        }
    }
}
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067792
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя в таком виде оно и в синхронном варианте нормально работает. Но это не совсем то, что я хотел - в таком виде придется дожидаться максимального по задержке запроса чтобы продолжить дальше. А в тасках можно было бы обрабатывать по приходу ответа.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067798
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если попытаться сформулировать... Мне нужно чтоб не блочился поток в пуле на время ожидания, но при этом чтоб прием данных происходил не в одном потоке, а в нескольких, в пуле. Ну то-есть разослали хоть тысячу запросов и ждем хоть год. А как пришел ответ (скажем пришли ответы от 10 одновременно) - получаем и обрабатываем его в несколько потоков (ну сколько там пул решит оптимальным)
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067822
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql,
как бы немножко обескуражен, от вашего кода. Имхо возникает масса вопросов про таски, абстракция для работы с потоками,
вот такая вот обструкция, что у многих сностит голову. А сносит, имхо из-за того, что отстутствуют так назывые понятия thread
и как устроены пулы.
что любят потоки, - самодостаточность, все что нужно, лежит внутри, никакого общения с наружностью, никаких общих
переменных, только в крайнем случае, как пример отдать результат., все что нужно, он получает при создании..
вы пошли в поход, все что нужно взяли с собой, ну и спутник,( позвонить маме что вы на вершине), никаких петь ( взять веревку когда полезем в гору)
что делает поток - поток выпоняет осмысленный кусок кода ( есть начало и есть конец) ба да... да это фукция.
получается, что бы поток запустился, в него нужно передать указатель на этот кусок ( или название функции, или написать ее
в виде лямбды по месту обьявления ( я опуская слово делегат что бы не морочить вам голову))
у потока есть интересная особенность, когда он исполнит код, он умирает ( про поход пример неудачный), как правило, за редким исключением.
если создать массу потоков, ими можно упралять как стадом баранов (синхронизация потоков).
в контексте вышесказанного.
вы должны стереть все нах.
1 содать статическую функцию закачки данных. оттестировать ее, то есть,
в главном методе( точке входа) только вызов этой функции, никаких бл. бенчмаркеров, ничего статического, кроме этой функции.
можете передать в параметрах - куда лезем.
почему статик ( для верочки, что шалавливые ручки не сделали замыкание)
2 проверить.
если все нормально - вы доросли до потока.
потом проще
создаемем список, ( желательно реентерабельный) и только чтение ( защитимся комилятором от шаловливых рук), куда будем выводить результат, если хочешь его обрабатывать
делай очередь, с одного конца закидывай результат, с другого выгребай на обработку (если не пустая)
Одни поток - запускаем
внизу ставим цикл прослушки списка, если в списке нуль - крутимся если 1 - поток отработал.
если все ок, делаем 100 потоков, в прослушке уже ловим 100.
и не забывать, что ексепешн - тоже результат ( а то замерзнешь до второго пришествия)
хочешь запустить их по зеленому сигналу светофора - кури синхронизацию потоков.
бенчмарки свои - можно спрятать в поток и отдать с результатом ( имхо более приближенно)
забудь про таски, таски потом...
жаль студия на работе - показал бы механизм создания свой пула потоков (10 - 20 строк кода) и забыть про таски..
имхо может завтра..
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067838
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql
Код: c#
1.
Task.WhenAll(tsk_write).Wait();


В печь.

iskatelsql
Код: c#
1.
Task.WhenAll(tsk_read).Wait();


В печь.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067839
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи
А сносит, имхо из-за того, что отстутствуют так назывые понятия thread
и как устроены пулы.

Сносит, имхо, из-за того, что отсутствуют так называемые понятия асинхронности.

Тут сплошной i/o - все вообще можно в одном потоке сделать с той же эффективностью.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067840
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну давайте, наседайте... Ваше право. Я вообще в первый раз с этой асинхронностью.
Сказал уже что нужно - обрабатывать результат во множестве потоков, но так чтоб пул не блокировался, и ожидающие шли ждать.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067842
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

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

ЗЫ. воспользоваться тем механизмом, не переписывать его.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067843
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как бы немножко обескуражен, от вашего кода.
я как- бы зашел спросить, то чего не знаю. По правилам нужно предоставить то, что сделал, что пытался сделать - я предоставил, оно работает даже. Что еще нужно?
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067844
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как бы немножко обескуражен, от вашего кода.

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

А даже не почти, а работает - конкретный вопрос был: от чего не ждет на Task.WaitAll(tasks.ToArray());

Так сложно именно на этот вопрос ответить?

Вы наверное забываете что разговариваете с самоучкой, а не с, как это называется, "сеньор разработчик" что-ли.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067846
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql
А даже не почти, а работает - конкретный вопрос был: от чего не ждет на Task.WaitAll(tasks.ToArray());


Если в лоб.
Метод же возвращает Task.
Т.е. вернул запущенную асинхронно задачу.
А не результат выполнения.

Обращайте внимание не только на название метода, но и на то, что он возвращает.
По идее, асинхронные методы в названии должны иметь суффикс -Async, но не все и не всегда этому следуют.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067847
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql,

Я минимально поправил код, приведённый в начале топика, добавленное выделено цветом.
Понятно, что выше приводили разные вариации, это именно минимальное исправленеи вашего кода, чтобы заработало. Но конечно есть к чему ещё придраться.

Код: 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.
static async Task Main(string[] args)
{
    List<Task> tasks = new List<Task>();
    Stopwatch sw = new Stopwatch();
    sw.Start();

    for (int i = 0; i < 100; i++)
    {
        tasks.Add(Task.Run(async() =>  // убрал вот этоTask.Factory.StartNew(async () =>
        {
            .........

            Task<int> readtask = stream.ReadAsync(data, 0, data.Length);
            await readtask;
            bytes = readtask.Result;

            .........
        }));
    }
    await Task.WaitAll(tasks.ToArray());

    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds);
    Console.ReadLine();
}
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067848
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

static async Task Main
Вот это обескураживающая меня конструкция, на которую компилятор ругается что нечего компилировать нет точки входа (vs 2019).
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067849
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql,

посмотрите здесь

https://docs.microsoft.com/ru-ru/dotnet/csharp/misc/cs4009

вам нужно настроить, что используется последняя версия языка C#



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

static async Task Main
Вот это обескураживающая меня конструкция, на которую компилятор ругается что нечего компилировать нет точки входа (vs 2019).


Хотя на пустом проекте сейчас это сработало. (раньше пытался изменить существующий)

Беру паузу, буду думать.
Спасибо Вам.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067857
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Код: c#
1.
await Task.WaitAll(tasks.ToArray());

fkthat
В печь.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067858
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Код: c#
1.
await Task.WaitAll(tasks.ToArray());


fkthat
В печь.

А, все, понял. Ты просто перепутал WaitAll и WhenAll. У меня на Wait или Result уже просто рефлекторная реакция.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067859
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
но не все и не всегда этому следуют.

Знал одних уродов, которые принципиально -Async не дописывали. И я с их кодом провозился полчаса на вызове как-то так:
Код: c#
1.
var userId = _userService.GetUser(...).Id;


Потому что GetUser возвращал Task. Сказано в букваре - дописывать -Async и ConfigureAwait, значит нехер какие-то свои половые фантазии выдумывать.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067863
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql,
да ничего вы не знаете, по этому разговариваю с вами как с ребенком,
гыгы знаю потоки но не могу писать асинхронный код.
ну да ладно, самое прикольное, когда вы пинками все исправите, и все будет партикулярно.
цена вашего кода будет меньше цены бумаги на которой он написан.
потому что: на простом декстопе на стандартным core5, нативные потоки будут исполняться быстрее примерно в 5 раз
чем пуловые, и вы виртуалного работатдателя введете в заблуждение. ( я кончно исключаю что это пром. решение)
зы гы
а еще, с вашими хотелками, (работать по свистку) тут ИМХО не совсем получится, и можно попасть в замок.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067873
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи
нативные потоки будут исполняться быстрее примерно в 5 раз
чем пуловые

Ололо. А почему не в 50, а то и, бери больше, в 500? В пуле какие-то особые потоки, в которые рантайм сам вставляет в случайных местах пустые циклы?
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067879
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
а ты попробуй его архитектуру.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067880
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи
а ты попробуй его архитектуру.

Чью?
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067883
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
у него закачка файлов, планировшик пула будет балансировать наргузку по минимальному количеству ядер,
Код: c#
1.
2.
3.
4.
5.
6.
 for (int d = 0; d < 100; d++)
 {
     Task.Run(() => { Thread.Sleep(200); Console.WriteLine($" done {++i}"); });
     //new Thread(() => { Thread.Sleep(200); Console.WriteLine($" done {++i}"); }).Start();
 }
            Console.Read();
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067890
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи
fkthat,
у него закачка файлов, планировшик пула будет балансировать наргузку по минимальному количеству ядер,
Код: c#
1.
2.
3.
4.
5.
6.
 for (int d = 0; d < 100; d++)
 {
     Task.Run(() => { Thread.Sleep(200); Console.WriteLine($" done {++i}"); });
     //new Thread(() => { Thread.Sleep(200); Console.WriteLine($" done {++i}"); }).Start();
 }
            Console.Read();



А ты вот так попробуй, и увидишь, как твой говнокод сосед три раза:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
const int N = 100;
const int DELAY = 1000;

Stopwatch sw = new();

sw.Start();
List<Thread> threads = new();
for (int d = 0; d < N; d++)
{
     Thread thread  = new(() => { Thread.Sleep(DELAY); });
     threads.Add(thread);
     thread.Start();
}
threads.ForEach(t => t.Join());
sw.Stop();
Console.WriteLine(sw.Elapsed);
sw.Reset();

sw.Start();
await Task.WhenAll(Enumerable.Repeat(0, N).Select(_ => Task.Delay(DELAY)));
sw.Stop();
Console.WriteLine(sw.Elapsed);
sw.Reset();
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067893
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
гы пробовать не начем, но имхо не убедительно.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067896
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи
гы пробовать не начем,

Ну тогда и не пересказывай тут свои выдумки.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40067951
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор, если ты используешь ReadAsync, то накой хрен тебе весь этот цирк с созданием тасков и прочим?
конечный метод чтения уже поддерживает асинхронность, больше тебе ничего не надо.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068004
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
А, все, понял. Ты просто перепутал WaitAll и WhenAll. У меня на Wait или Result уже просто рефлекторная реакция.


Да, не обратил внимания, спасибо :)
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068008
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи
цена вашего кода будет меньше цены бумаги на которой он написан.


Цена помидорок, которые Вы вырастите на даче будет меньше, чем цена помидорок, выращенных профессиональным селекционером.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068009
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
del что-то странное - вместо правки добавляет новое сообщение
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068017
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql
Честно говоря я не понял что из того, что по ссылке, может помочь.

Там написано, что возвращает Task.Factory.StartNew, если ему скармливают делегат с async. И из этого напрямую следует, почему
iskatelsql
на Task.WaitAll(tasks.ToArray()); программе стало наплевать, сразу переходит к записи времени в консоль

iskatelsql
Цена помидорок, которые Вы вырастите на даче будет меньше, чем цена помидорок, выращенных профессиональным селекционером.

Это общераспространённое заблуждение. Себестоимость любого продукта, произведённого в промышленных масштабах, ниже себестоимости кустарного производства.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068032
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>hVostt, вчера, 04:17 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1335799&msg=22317373][22317373]
>посмотрите здесь
<
прибавление, и здесь
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068056
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>iskatelsql, 1 май 21, 15:44 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1335799&msg=22317238][22317238]
>...Мне нужно было сделать чтение асинхронным, и я переписал так:
<
По идее должно работать. Посмотри здесь ,
в части ReadAsync(Byte[], Int32, Int32). Примеры.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068225
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи
и вы виртуалного работатдателя введете в заблуждение.

Да это на самом деле мое хобби, точнее приложение к хобби. Задачи типа переделать данные в формат, понятный какой ни будь программе. Мой код это топором переделанная копипаста из инета. Часто он нужен только один раз в жизни, и поэтому ни проверок ни юзер-интерфейсов не имеет - запускается из под отладчика. И если дважды два не намного больше пяти то сойдет :)

Где-то в степи
да ничего вы не знаете, по этому разговариваю с вами как с ребенком.

Да, не знаю, но давайте хотяб как со студентом-первокурсником. А то как с ребенком - это "туда не ходи сюда не лезь, брось бяку"...

Где-то в степи
а еще, с вашими хотелками

Это не хотелки, это изучение мастерской прежде чем изобретать в ней велосипед. Появилась "гениальная" идея - дай погуглю и спрошу, вдруг так и правда можно.

ЗЫ. я разбираюсь в отладчиках / дизассемблерах. Собственно мое знакомство с программированием началось с SoftIce. Понимать как все работает я умею, реверснуть несложную прогу без защит смогу, а вот красивый код писать - ну наверное не мое.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068285
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забудьте вы наконец все про эти Wait, Result, Run и подобное, как будто их и нет вовсе. Run иногда может быть нужен, но единственное для чего он нужен - это завернуть синхронный код, который by design невозможно переделать в асинхронный путем помещения его в поток из пула. Всё.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068291
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Забудьте вы наконец все про эти Wait, Result, Run и подобное, как будто их и нет вовсе. Run иногда может быть нужен, но единственное для чего он нужен - это завернуть синхронный код, который by design невозможно переделать в асинхронный путем помещения его в поток из пула. Всё.


Сложна :)
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068463
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Забудьте вы наконец все про эти Wait, Result, Run и подобное, как будто их и нет вовсе.


я с асинхронностью дела никогда не имел, может и не туда лезу (хотя неплохо было б разобраться)

Допустим потоки: Вот представьте торрент-клиент: нужно коннектиться ко многим. Если мало потоков поставишь - а они (сидеры) ограничение скорости настроили в 100 кбит- некачается... Много поставишь - а там волна пойдет больше чем пропускная способность - цирк с конями, разрывы по таймаутам.

Вот я и хотел от этой асинхронности чтоб те, что ожидают пакет, в очередь ставились, а те что пакет принимают - принимали.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068476
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql
может и не туда лезу

Ты лезешь куда надо, только не с той стороны.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068485
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

авторСказано в букваре - дописывать -Async и ConfigureAwait,
ConfigureAwait прям везде?
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068496
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068539
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat


Для библиотек мы юзаем Fody :)
Честно говоря, не понимаю, почему эта фича не входит в коробку, я имею в виду глобальная настройка на уровне сборки.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068542
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Честно говоря, не понимаю, почему эта фича не входит в коробку, я имею в виду глобальная настройка на уровне сборки.

Ну так она через инструментацию сборки ведь работает? Если так, то логичнее было бы её тогда вообще в сам компилятор встроить.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068591
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

в гнезде :)

не одним мсдном
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068595
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!
fkthat,
в гнезде :)
не одним мсдном

Ты мне предлагаешь изучать по чьему-то блогу то, что я и так уже сто лет как знаю?
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068600
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

нет, я тебе предлагаю не возводить ничего в абсолют.
и не ломать неокрепших умов.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068604
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

ну и если очень хочется официальной доки

авторYou should not use ConfigureAwait when you have code after the await in the method that needs the context. For GUI apps, this includes any code that manipulates GUI elements, writes data-bound properties or depends on a GUI-specific type such as Dispatcher/CoreDispatcher. For ASP.NET apps, this includes any code that uses HttpContext.Current or builds an ASP.NET response, including return statements in controller actions. Figure 7demonstrates one common pattern in GUI apps—having an async event handler disable its control at the beginning of the method, perform some awaits and then re-enable its control at the end of the handler; the event handler can’t give up its context because it needs to re-enable its control.

правда, твое "всегда" уже не всегда?
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068610
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
You should not use ConfigureAwait when you have code after the await in the method that needs the context.

Удивишься, но это эквивалентно вызову ConfigureAwait(true) потому что оно по-дефолту.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068612
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!
правда, твое "всегда" уже не всегда?

Можешь его не писать, лично тебе я разрешаю.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068613
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

ага. ну я понял. и ты тоже.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068617
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМожешь его не писать, лично тебе я разрешаю.
я-то как раз пишу. где надо. где не надо - не пишу.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068624
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Честно говоря, не понимаю, почему эта фича не входит в коробку, я имею в виду глобальная настройка на уровне сборки.

Ну так она через инструментацию сборки ведь работает? Если так, то логичнее было бы её тогда вообще в сам компилятор встроить.


Примерно так это и работает, сначала компилируется, потом Fody вносит изменения прям в сборку, добавляя везде ConfigureAwait()
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068634
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!
я-то как раз пишу. где надо. где не надо - не пишу.

Забей, я же тебе дал карт-бланш писать как хочешь. Будут проблемы, например, с ревью - скажи, что я уже одобрил.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40068685
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Ты лезешь куда надо, только не с той стороны.

Ну ЗБС теперь, его заблочили до того, как он мне объяснил с какой стороны лезть.

Разблочьте плиз, пусть по теме то ответит, раз среди вас желающих нет...
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40069779
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql,

Смотри. Забудь на время о потоках вообще. Нет их. (Имхо, кстати, чем до этого больше дела имел с "обычной" многопоточностью, тем сложнее может быть воткнуть в TPL). Есть только асинхронные методы/вызовы - это любые методы, которые возвращают объект Task. Task - это нечто, что рано или поздно перейдет либо в состояние "завершено успешно" либо "завершено с ошибкой". Единственный правильный способ отследить завершение таска это вызвать для него ContinueWith - он типа как цепляет на таск "обработчик события" для его (таска) завершения. И сам он в свою очередь возвращает таск, который означает "я завершусь когда завершится первый таск, а потом выполнится обработчик. Вот. Теперь, если писать достаточно сложный код таким образом (с ContinueWith) то получится громоздкая конструкция и цепочек этих ContinueWith и коллбеков, которые им передаются. Поэтому придумали конструкцию async/await, с которой все упрощается - если взять код наподобии такого:

Код: c#
1.
2.
3.
4.
5.
6.
async Task FooAsync()
{
    await BarAsync();
    await BazAsync();
    await BlaAsync();
}



то, на самом деле, (отвлекаясь от мудреных деталей) компилятор просто превратит его во что-то схожее с:

Код: c#
1.
2.
3.
4.
5.
Task FooAsync()
{
    return BarAsync()
       .ContinueWith(() => BazAsync())
       .ContinueWith(() => BlaAsync());



Т.е. он просто вернет объект таск "завершусь тогда, когда завершится таск из BarAsync(), потом завершится таск из BazAsync(), а после этого завершится таск из BlaAsync()". Вот и все. Ты на самом деле никогда ничего не "ждешь завершения", а манипулируешь тасками цепляя явно или неявно на них коллбеки ContinueWith. Ну и есть еще готовые нужные утилиты для работы с тасками, например Task.WhenAll - таск который завершится сразу когда завершатся все переданные в него таски, или Task.WhenAny - завершится когда завершится хоть один из тасков, и еще другие - можешь посмотреть доки по TPL.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40069781
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

так то, таск не обязан завершаться и может не завершаться вообще, но всё равно + в карму, что время не пожалел и всё расписал :)
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40072121
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

У меня как раз проблема с тем, что таск порождает таск..., "каин породил авеля а авель.." и так далее. Как это безобразие прекратить то? Они на вызове требуют опять asinc. В одном из ответов предлагалось даже переделать майн в асинк static async Task Main(string[] args) . Есть у этой цепочки какой-то стопор?
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40072126
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql
fkthat,

У меня как раз проблема с тем, что таск порождает таск..., "каин породил авеля а авель.." и так далее. Как это безобразие прекратить то? Они на вызове требуют опять asinc. В одном из ответов предлагалось даже переделать майн в асинк static async Task Main(string[] args) . Есть у этой цепочки какой-то стопор?

Нет, нету. Один из евангелистов async-await (Клири вроде как) уже сравнивал это с зомби-вирусом - если в одном месте кода это завелось, то оно неудержимо расползается по всему коду.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40072145
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iskatelsql
Есть у этой цепочки какой-то стопор?

А какая необходимость в этом самом "стопоре"? Зачем тебе вообще "ждать" таск - просто чтобы "ждать"? Ты делаешь просто Main асинхронным и возвращаешь из него некий "таск всех тасков" - а все остальное за тебя сделает фреймворк.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40072163
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes
таск не обязан завершаться и может не завершаться вообще

Теоретически, это вполне может быть (например, если в нем тот же самый бесконечный цикл), но это все-таки не очень хороший таск, потому что он в итоге будет грубовато пришиблен при завершении приложения - по-хорошему для такого должна быть предусмотрена его "мягкая" остановка через CancellationToken.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40072249
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Имхо, кстати, чем до этого больше дела имел с "обычной" многопоточностью, тем сложнее может быть воткнуть в TPL)


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

Ума не приложу как завести такое тасками без потоков. Во всех примерах асинхронная операция это что-то временное - например запись на диск.

fkfka
А какая необходимость в этом самом "стопоре"


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

ЗЫ. теперь совсем запутался.
...
Рейтинг: 0 / 0
async await что я делаю не так?
    #40072269
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iskatelsql
Я не понимаю как асинхронность запустить постоянно, думаю в цикле...


Вот так, что ли?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public async Task LoopAsync()
{
    for(var i = 0; i < 100500; i++)
    {
        await DoSomethingAsync(i);
    }
}

public async Task DoSomethingAsync(int i)
{
    await Console.Out.WriteLineAsync($"Hello from #{i}");
}
...
Рейтинг: 0 / 0
67 сообщений из 67, показаны все 3 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / async await что я делаю не так?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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