我正在寻找一种调用多个异步操作并能够取消它们的简单方法:
var cancelTask = new ManualResetEvent(false);
IAsyncResult ar = StartAsyncBatch(cancelTask);
int resp = WaitHandler.WaitAny({ar.AsyncWaitHandle, cancelTask});
我必须如何构建 StartAsyncBatch?是否应该是派生类
class StartAsyncBatch : IAsyncResult
最佳答案
简单的回答就是你可以通过CancellationTokenSource构建的相应CancellationToken取消等待任务。这是一个例子。
var tokenSource = new CancellationTokenSource();
var task = Task.Factory.StartNew(() =>
{
for (int i = 0; i < 10; i++)
{
if (tokenSource.IsCancellationRequested)
{
//you know the task is cancelled
//do something to stop the task
//or you can use tokenSource.Token.ThrowIfCancellationRequested()
//to control the flow
}
else
{
//working on step i
}
}
}, tokenSource.Token);
try
{
task.Wait(tokenSource.Token);
}
catch (OperationCanceledException cancelEx)
{
//roll back or something
}
//somewhere e.g. a cancel button click event you call tokenSource.Cancel()
当您处理几个任务时,情况会有所不同。首先你要知道取消一个任务,其他任务还会继续吗?如果是,您需要为不同的任务创建不同的取消 token 并独立处理取消。否则他们可以共享相同的取消 token 。不同的需求导致不同的取消处理政策。
关于c# - 如何等待多个异步操作完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6906778/