异步等待超时初始化设备

问题描述 投票:0回答:1

我有多个设备需要初始化,每个设备将由一个任务初始化。

有时设备初始化失败会报错,有时会无响应。

我想要做的是,当所有任务都收到成功结果时,然后向用户显示成功的 UI。

当所有任务完成但设备初始化失败时,显示哪个设备初始化失败的详细信息。

当设备初始化超过超时时,显示哪些设备已经超过超时初始化。

如何通过

Task
实现这一目标?目前我正在使用 .NET 7。

c# asynchronous .net-7.0
1个回答
0
投票

也许您应该使用基于超时和取消的混合方法。

CancellationTokenSource tcs = new();
IEnumerable<Task> tasks = InitializedDevices(tcs.Token);
Task[] cancelled = Array.Empty<Task>();
bool wasCancellation = false;
TimeSpan timeout = ...;
try
{
   await Task.WhenAll(tasks).WaitAsync(timeout);
}
catch(TimeoutException)
{
   //due to nitty gritty things of handling exception
   //i would try to check status of tasks to cancel those still uncompleted
   //they might still consuming valuable resources
   if (tasks.Any(t => t.Status != TaskStatus.RanToCompletion))
   {
     cts.Cancel(); 
     wasCancellation = true;
   }
}
catch(Exception)
{
   //log some unexpected exception
}

if (wasCancellation)
{
  cancelled = tasks.Where(t => t.Status == TaskStatus.Cancelled).ToArray();
  //do whatever you want
}
     

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.