【发布时间】:2012-05-27 13:23:02
【问题描述】:
我调用了一个异步方法,该方法又调用需要启动几个异步操作。
所有异步操作完成后,我需要通知调用者操作是完成还是取消。代码如下所示。它似乎一直有效,直到它因 FatalExecutionEngineError 而崩溃。我不会进行任何 P/invoke 或不安全的调用。
public class Fetcher
{
private List<ItemsBoundToUI> uiItems;
public async Task<bool> Fetch()
{
List<Task> currentlyRunningTasks = new List<Task>();
var src = new CancellationTokenSource();
foreach (var channel in this.uiItems)
{
var task = FetchForItem(channel, src.Token);
currentlyRunningTasks.Add(task);
}
bool wasCancelled = await Task.Factory.ContinueWhenAll(currentlyRunningTasks.ToArray(),
(s) =>
{
bool wasC = s.Any(ss => ss.IsCanceled);
return wasC;
}
);
return !wasCancelled;
}
private async Task FetchForItem(ItemsBoundToUI channel, CancellationToken src)
{
var subitems = await dataRepository.GetSubItemsAsync(channel.ID);
if (src.IsCancellationRequested)
return;
channel.SubItems = subitems;
}
}
错误信息说
运行时遇到致命错误。错误的地址 位于线程 0xd94 上的 0x6c108144。错误代码为 0xc0000005。这 错误可能是 CLR 中的错误或不安全或不可验证的错误 部分用户代码。此错误的常见来源包括用户 COM-interop 或 PInvoke 的封送处理错误,这可能会损坏 堆栈。
如何等到所有任务都完成,或者等到它们被取消,然后返回一个值来指示它们是完成还是被取消?
【问题讨论】:
-
不是你所看到的答案,但如果你想返回它是否被取消,为什么不直接返回 src.IsCancellationRequested? FWIW,在 FetchForItem 方法中调用 CancellationToken 'src' 似乎很奇怪 :)
标签: .net windows-8 async-await c#-5.0