【发布时间】:2021-03-25 07:24:10
【问题描述】:
我有一个 .Net 核心应用程序,它基本上做这样的事情:
public async Task<IOBoundStuffResult> DoIOBoundStuff()
{
// Do IO bound stuff ...
return new IOBoundStuffResult
{
Id = getIdForThing()
};
}
public async Task<OtherIOBoundStuffResult> DoOtherIOBoundStuff()
{
// Do other IO bound stuff ...
return new OtherIOBoundStuffResult
{
Uri = getUriForThing()
};
}
public async Task<IOBoundTaskResult> DoIOBoundStuff()
{
var ioBoundTask1 = doIOBoundStuff();
var ioBoundTask2 = doOtherIOBoundStuff();
return await Task.WhenAll(ioBoundTask1, ioBoundTask2)
.ContinueWith((task) =>
{
var id = ioBoundTask1.Result.Id;
var uri = ioBoundTask2.Result.Uri;
doSomethingWithIdAndUri(id, uri);
return new IOBoundTaskResult
{
Id = id,
Uri = uri
};
});
}
public async Task<IActionResult> DoThing()
{
try
{
var cpuBoundTask = Task.Run(() =>
{
doCPUBoundStuff();
});
var ioBoundTask = DoIOBoundStuff();
// do stuff with ioBoundTask, cpuBoundTask
}
catch (System.Exception ex)
{
// Process System.Exception.AggregateException, other exceptions
}
}
这里的问题是,如果其中一项任务引发异常(特别是 doSomethingWithIdAndUri()),那么 try...catch 块不会捕获异常并导致崩溃。我尝试使用TaskContinuationOptions.OnlyOnFaulted 创建继续任务来处理异常,但似乎所做的一切总是导致TaskCancelledException 被抛出。如何捕获任务引发的异常?
【问题讨论】:
-
等待他们? [添加字符以满足要求]
-
@PeterBons 是的,我正在等待 cpuBoundTask、ioBoundTask,如果这就是你的意思。
-
我看到一个似乎没有等待的 Task.Run,对吗?
标签: c# exception .net-core async-await task-parallel-library