考虑下面的代码片段获取例外:异步等待来自内部任务结果
public Task StartReading()
{
var activityCheck = Task.Factory.StartNew(async() => await this.CheckActivityTimeout(), this._token.Token).Unwrap();
var reading = Task.Factory.StartNew(async() => await this.ReadAsync(), this._token.Token).Unwrap();
// for reference, this code produces the same result:
// var activityCheck = this.CheckActivityTimeout();
// var reading = this.ReadAsync();
return Task.WhenAny(reading, activityCheck);
}
当一个异常在CheckActivityTimeout
被抛出,我如下接住。
var read = StartReading()
var tasks = new Task[] { read, taskx, tasky, taskz };
int completed = Task.WaitAny(tasks);
var r = tasks[completed];
r
没有它的例外设置。相反,如果我查看调试器,我发现r
任务的异常存储在Result
属性中。我如何得到这个实际结果?
r
具有类型Id = 17, Status = RanToCompletion, Method = "{null}", Result = "System.Threading.Tasks.UnwrapPromise``1[System.Threading.Tasks.TaskExtensions+VoidResult]"
你可以看到实际的例外是内任务的结果里。我如何向上传播它?
r.Exception == null
r.Result
无法访问。
更新
var r = Task.WhenAny(tasks).Result; // produces exactly the same wrapped result!
在它看起来像这样的调试器:
不确定这是否相关,但是'Task.Factory.StartNew'不支持'async'委托。改为使用'Task.Run'。 –
另外,你为什么要创建一个新的任务来调用像“CheckActivityTimeout”这样的异步方法?为什么不直接打给他们呢? –
更改代码以使用'Task.Run'具有相同的结果。 – Jim