вот приходит мне общий токен отмены как параметн, а я хочу чтобы отменялось не тока по нему, но и по указанному таймауту
мне что вот стока хлама нада написать?
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 г.
Ну да, примерно так.
Только еще обработку ошибок нужно сделать, иначе на первом 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 */ }
}
}
}
Здравствуйте, Barbar1an, Вы писали:
B>мне что вот стока хлама нада написать?
https://github.com/rsdn/CodeJam/blob/master/CodeJam.Main/Threading/TaskHelper.WithExtensions.cs... << RSDN@Home 1.3.17 alpha 5 rev. 62>>