簡體   English   中英

如何等待所有並發任務在同步代碼.NET 4.5中完成?

[英]How to wait for all concurrent Tasks to complete in synchronous code .NET 4.5?

我有以下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需要阻止,我該怎么做? 然后,作為獎勵,我如何使用async修飾符將返回值從各個任務傳回方法之外?

希望我能正確理解。 但是,您不只是需要添加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);

那應該按照您想要的方式工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM