Re[4]: Можно ли избавиться от async|await?
От: Shmj Ниоткуда  
Дата: 17.12.25 11:18
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Эквивалент в Go твоего примера на C# будет такой:


func sum(a, b int) int {
    return a+b;
}

x:=sum(2,3)


Не будет и близко. В C# я могу получить Task (в JS — Promise, в Dart — Future и т.д). Это позволяет мне писать легко и просто вот такое:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    private static int _globalCounter = 0;

    static async Task Main()
    {
        const int n = 10;
        var tasks = new List<Task<int>>(n);

        for (int i = 0; i < n; i++)
        {
            tasks.Add(Task.Run(async () =>
            {
                await Task.Delay(1000);

                int current = Interlocked.Increment(ref _globalCounter);

                if (current % 2 == 0)
                    throw new InvalidOperationException($"Ошибка: счетчик={current}, нельзя вернуть чётное значение.");

                return current;
            }));
        }

        // Ждём все задачи и "гасим" исключение на уровне await через continuation
        await Task.WhenAll(tasks).ContinueWith(t =>
        {
            // можно оставить пусто
            // если нужно — тут можно залогировать:
            // if (t.Exception != null) Console.WriteLine(t.Exception);

        }, TaskContinuationOptions.ExecuteSynchronously);

        var successful = tasks
            .Where(t => t.Status == TaskStatus.RanToCompletion)
            .Select(t => t.Result)
            .ToList();

        var errors = tasks
            .Where(t => t.IsFaulted)
            .SelectMany(t => t.Exception!.Flatten().InnerExceptions)
            .Select(ex => ex.Message)
            .ToList();

        Console.WriteLine("Успешные результаты: " + (successful.Count == 0 ? "(нет)" : string.Join(", ", successful)));
        Console.WriteLine("Сумма успешных результатов: " + successful.Sum());

        Console.WriteLine($"Успешно: {successful.Count}, с ошибкой: {errors.Count}");

        Console.WriteLine("Тексты ошибок:");
        if (errors.Count == 0)
        {
            Console.WriteLine("(нет)");
        }
        else
        {
            foreach (var e in errors)
                Console.WriteLine(" - " + e);
        }

        Console.WriteLine("Финальный глобальный счетчик: " + _globalCounter);
    }
}


Тут: https://dotnetfiddle.net/e49LaQ

А ты сможешь так на Go

Ну-ну. Сдюжь.
=сначала спроси у GPT=
Отредактировано 17.12.2025 11:21 Shmj . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.