CancellationTokenSource неудобный какой-то
От: Barbar1an Украина  
Дата: 28.06.22 09:45
Оценка:
вот приходит мне общий токен отмены как параметн, а я хочу чтобы отменялось не тока по нему, но и по указанному таймауту

мне что вот стока хлама нада написать?


void Get(CancellationToken cancellation)
{
    using(var cts1 = new CancellationTokenSource(10 * 1000))
    {
        foreach(var h in Hubs)
        {
            var lcts1 = CancellationTokenSource.CreateLinkedTokenSource(cancellation, cts1.Token);
        
            var h = Connect(h, lcts1.Token);
        
            using(var cts2 = new CancellationTokenSource(10 * 1000))
            {
                var lcts2 = CancellationTokenSource.CreateLinkedTokenSource(cancellation, cts2.Token);
        
                var lp = h.LocatePackage(package, lcts2.Token);
            }
        }
    }
}


причем CancelAfter я не могу использовать потому что отмена по таймауту не долждна отменять всё, а только значить что я не мог подключиться к этому хабу и попробую другой

хотя... вроде можно так:
void Get(CancellationToken cancellation)
{
    using(var cts1 = new CancellationTokenSource())
    {
        var lcts1 = CancellationTokenSource.CreateLinkedTokenSource(cancellation, cts1.Token);
        
        foreach(var h in Hubs)
        {
            lcts.CancelAfter(10 * 1000);
            var h = Connect(h, lcts1.Token);
        
        
            lcts.CancelAfter(10 * 1000);
            var lp = h.LocatePackage(package, lcts1.Token);
        }
    }
}
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Отредактировано 28.06.2022 10:19 Barbar1an . Предыдущая версия . Еще …
Отредактировано 28.06.2022 10:19 Barbar1an . Предыдущая версия .
Отредактировано 28.06.2022 9:58 Barbar1an . Предыдущая версия .
Отредактировано 28.06.2022 9:45 Barbar1an . Предыдущая версия .
Re: CancellationTokenSource неудобный какой-то
От: RushDevion Россия  
Дата: 28.06.22 10:29
Оценка: 8 (2)
Ну да, примерно так.
Только еще обработку ошибок нужно сделать, иначе на первом hub timeout упадет.

Можно упростить как-нибудь вот так:
// Добавляем Extension
public static async Task<TResult> WithTimeout<TResult>(this Task<TResult> task, TimeSpan timeout, CancellationToken cToken)
{
    using var cts = CancellationTokenSource.CreateLinkedTokenSource(cToken);
    var completedTask = await Task.WhenAny(task, Task.Delay(timeout, cts.Token));
    if (completedTask == task)
    {
        cts.Cancel();   // Cancel to stop timer
        return await task;
    }
    else
    {
        throw new TimeoutException();
    }
}

// И будет покрасивше
public Task LocatePackageAsync(string name, CancellationToken cToken) => LocatePackageCoreAsync(name, cToken).WithTimeout(TimeSpan.FromSeconds(30));

public async Task LocatePackageCoreAsync(CancellationToken cToken)
{
    foreach (var hub in hubs)
    {
        try
        {
            var hub = await ConnectAsync(hub).WithTimeout(TimeSpan.FromSeconds(5), cToken);
            var package = await hub.LocatePackage(package).WithTimeout(TimeSpan.FromSeconds(5), cToken);
            if (package != null) return package;
        }
        catch (TimeoutException) { /* Ignore hub operation timeout */ }
    }

}
}
Re: CancellationTokenSource неудобный какой-то
От: Ночной Смотрящий Россия  
Дата: 28.06.22 11:24
Оценка: 80 (1)
Здравствуйте, Barbar1an, Вы писали:

B>мне что вот стока хлама нада написать?


https://github.com/rsdn/CodeJam/blob/master/CodeJam.Main/Threading/TaskHelper.WithExtensions.cs
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.