Сообщение 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

Ну-ну. Сдюжь.
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# будет такой:
Не будет и близко. В C# я могу получить Task (в JS — Promise, в Dart — Future и т.д). Это позволяет мне писать легко и просто вот такое:
Тут: https://dotnetfiddle.net/e49LaQ
А ты сможешь так на Go
Ну-ну. Сдюжь.
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
Ну-ну. Сдюжь.