c# - 如何等待多个异步操作完成

标签 c# .net

我正在寻找一种调用多个异步操作并能够取消它们的简单方法:

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/

相关文章:

c# - C# 中的内存泄漏

c# - WCF - 让客户端检查服务可用性

c# - 从文件名(或目录、文件夹、文件)中删除无效(不允许的、坏的)字符

c# - Nhibernate通过代码映射,如何使用存储过程?

.net - 无法将 Dotfuscator 与引用 Microsoft.Bcl.Async 的应用程序一起使用

c# - 为什么这行代码不起作用?

c# - Asp.Net LINQ 组合三个表

c# - RabbitMQ + Windows + LDAP 无需发送密码

c# - 在 C# 代码中打开第二个创建的文件夹

c# - AppDomain 依赖解析顺序