如何在同步代码 .NET 4.5 中等待所有并发任务完成

本文关键字:等待 并发 任务 同步 代码 NET | 更新日期: 2023-09-27 17:56:02

我有以下 ServiceStack Web 服务

public class RetreadServices : Service
{
    public IRepository Repository { get; set; }
    //http://stackoverflow.com/questions/18902135/servicestack-no-server-side-async-support
    public async Task<ValidationResponse> Get(RetreadSsnInfoAsync request)
    {
        return await Task.Factory.StartNew(() =>
        {
            Tenant.SetTenant(request.TenantId);
            return new ValidationResponse { Result = Repository.CannotRetreadSsn(request.Ssn) };                    
        });
    }
    public async Task<ValidationResponse> Get(RetreadEmailInfoAsync request)
    {
        return await Task.Factory.StartNew(() =>
        {
            Tenant.SetTenant(request.TenantId);
            return new ValidationResponse { Result = Repository.CannotRetreadEmail(request.Emails) };
        });
    }
    //more methods constructed in the same fashion
}

然后在我应用程序中的单独类中,我有此方法(基于 @StephenCleary 中的代码)

private async Task<ValidationResponse[]> DoOperationsConcurrentlyAsync(string tenantId, string[] emails, string ssn)
{
    Task<ValidationResponse>[] tasks =
    {
        ResolveService<RetreadServices>().Get(new RetreadEmailInfoAsync { TenantId = tenantId, Emails = emails }), 
        ResolveService<RetreadServices>().Get(new RetreadSsnInfoAsync { TenantId = tenantId, Ssn = ssn })
    };
    await Task.WhenAll(tasks);
    ValidationResponse[] result = new ValidationResponse[tasks.Length];
    return result;
}

并像这样被调用

synchronous code...
synchronous code...
var result = DoOperationsConcurrentlyAsync(request.TenantId, request.Emails, request.Ssn);
synchronous code...
synchronous code...

所有这一切的目标是等待任务并行处理,并希望减少我的总体时间......但是DoOperationsConcurrentlyAsync需要阻止,我该怎么做?然后作为奖励,如何使用异步修饰符将返回值从各个任务向上传递并传出方法?

如何在同步代码 .NET 4.5 中等待所有并发任务完成

我希望我理解正确。 但是您不需要添加await关键字吗?

synchronous code...
synchronous code...
var result = await DoOperationsConcurrentlyAsync(request.TenantId, request.Emails, request.Ssn);
synchronous code...
synchronous code...

编辑:奖励问题:再次,我希望我正确理解你...

但我会替换这个:

await Task.WhenAll(tasks);
ValidationResponse[] result = new ValidationResponse[tasks.Length];
return result;

。简单地说:

return await Task.WhenAll(tasks);

这应该按照您想要的方式工作。