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

Сообщение Re[4]: Можно ли избавиться от async|await? от 17.12.2025 11:18

Изменено 17.12.2025 11:21 Shmj

Re[4]: Можно ли избавиться от async|await?
Здравствуйте, gandjustas, Вы писали:

G>[code]

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);
}
}
[/cs]

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



Ну-ну. Сдюжь.
Re[4]: Можно ли избавиться от async|await?
Здравствуйте, 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

Ну-ну. Сдюжь.