我有多个设备需要初始化,每个设备将由一个任务初始化。
有时设备初始化失败会报错,有时会无响应。
我想要做的是,当所有任务都收到成功结果时,然后向用户显示成功的 UI。
当所有任务完成但设备初始化失败时,显示哪个设备初始化失败的详细信息。
当设备初始化超过超时时,显示哪些设备已经超过超时初始化。
如何通过
Task
实现这一目标?目前我正在使用 .NET 7。
也许您应该使用基于超时和取消的混合方法。
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
}
干杯!