gpt4 book ai didi

c# - 忽略在Task.WhenAll处引发异常的Tasks,仅获取完成的结果

转载 作者:行者123 更新时间:2023-12-03 15:22:36 24 4
gpt4 key购买 nike

我正在处理一个任务并行问题,我有很多可能会或可能不会抛出异常的任务。

我想处理所有正确完成的任务并记录其余任务。 Task.WhenAll propage Task异常,但不允许我收集其余结果。

    static readonly Task<string> NormalTask1 = Task.FromResult("Task result 1");
static readonly Task<string> NormalTask2 = Task.FromResult("Task result 2");
static readonly Task<string> ExceptionTk = Task.FromException<string>(new Exception("Bad Task"));
var results = await Task.WhenAll(new []{ NormalTask1,NormalTask2,ExceptionTk});

带有 Task.WhenAll异常的 ExcceptionTk忽略其余结果。如何获得忽略异常的结果并同时记录异常?

我可以将任务包装到另一个对内部异常进行 try{...}catch(){...}编码的任务中,但是我无权访问它们,并且希望不必增加此开销。

最佳答案

您可以创建一个这样的方法来代替Task.WhenAll:

public Task<ResultOrException<T>[]> WhenAllOrException<T>(IEnumerable<Task<T>> tasks)
{
return Task.WhenAll(
tasks.Select(
task => task.ContinueWith(
t => t.IsFaulted
? new ResultOrException<T>(t.Exception)
: new ResultOrException<T>(t.Result))));
}


public class ResultOrException<T>
{
public ResultOrException(T result)
{
IsSuccess = true;
Result = result;
}

public ResultOrException(Exception ex)
{
IsSuccess = false;
Exception = ex;
}

public bool IsSuccess { get; }
public T Result { get; }
public Exception Exception { get; }
}

然后,您可以检查每个结果以查看是否成功。

编辑:上面的代码不处理取消;这是另一种实现:
public Task<ResultOrException<T>[]> WhenAllOrException<T>(IEnumerable<Task<T>> tasks)
{
return Task.WhenAll(tasks.Select(task => WrapResultOrException(task)));
}

private async Task<ResultOrException<T>> WrapResultOrException<T>(Task<T> task)
{
try
{
var result = await task;
return new ResultOrException<T>(result);
}
catch (Exception ex)
{
return new ResultOrException<T>(ex);
}
}

关于c# - 忽略在Task.WhenAll处引发异常的Tasks,仅获取完成的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39589640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com