2016-04-27 5 views
0

У меня проблема с блокировкой задачи, когда я пытаюсь восстановить ее результат.Результат задачи async блокируется

У меня есть следующий фрагмент кода, который я хочу выполняться синхронно (именно поэтому я ищу результата)

Я бы игнорировать причину каждый вызов должен быть сделан (унаследованного программного обеспечения, которое требует нескольких вызовов через разные уровни)

вызов, кажется, сломался после того, как он запускает задачу для окончательного вызова, который должен быть сделан в PostCreateProfile, я вижу, что этот запрос никогда не делает этого дальше.

if (CreateProfile(demographics).Result) // Task blocks here 
{ 
    //dothing 
} 

private async Task<bool> CreateProfile(Demographics demographics) 
{ 
    ProfileService profileService = new ProfileService(); 

    CreateProfileBindingModel createProfileBindingModel = this.CreateProfileModel(demographics); 

    return await profileService.Create(createProfileBindingModel); 
} 

public async Task<bool> Create(CreateProfileBindingModel model) 
{ 
    HttpResponseMessage response = await profileServiceRequest.PostCreateProfile(rootURL, model); 

    return response.IsSuccessStatusCode; 
} 

public Task<HttpResponseMessage> PostCreateProfile(string url, CreateProfileBindingModel model) 
{ 
    HttpContent contents = SerialiseModelData(model); 
    var resultTask = client.PostAsync(url, contents); 

    return resultTask; 
} 

Запрос достигнет своего назначения, если я должен был изменить CreateProfile к асинхронным пустоте, как так:

private async void CreateProfile(AppointmentController controller) 
{ 
    ProfileService profileService = new ProfileService(); 

    CreateProfileBindingModel createProfileBindingModel = this.CreateProfileModel(controller); 

    await profileService.Create(createProfileBindingModel); 
} 

Но я не могу вернуть BOOL я хочу использовать из этого. Может ли кто-нибудь указать, что я делаю неправильно?

+0

'private async void CreateProfile' плохой, попробуйте' private async Task', вы все равно можете «ждать» его. С 'async void' вы просто запустите задачу и вернетесь до ее завершения. –

ответ

1

You should never call .Result on a async/await chain.

Независимо от кода, который вызывает CreateProfile(demographics) потребности быть асинхронной тоже так что он может сделать

if (await CreateProfile(demographics)) 
{ 
    //dothing 
} 

Кроме того, если вы можете действительно должны поставить .ConfigureAwait(false) везде, где это логически возможно.

if (await CreateProfile(demographics).ConfigureAwait(false)) // depending on what dothing is you may not want it here. 
{ 
    //dothing 
} 

private async Task<bool> CreateProfile(Demographics demographics) 
{ 
    ProfileService profileService = new ProfileService(); 

    CreateProfileBindingModel createProfileBindingModel = this.CreateProfileModel(demographics); 

    return await profileService.Create(createProfileBindingModel).ConfigureAwait(false); 
} 

public async Task<bool> Create(CreateProfileBindingModel model) 
{ 
    HttpResponseMessage response = await profileServiceRequest.PostCreateProfile(rootURL, model).ConfigureAwait(false); 

    return response.IsSuccessStatusCode; 
} 

public Task<HttpResponseMessage> PostCreateProfile(string url, CreateProfileBindingModel model) 
{ 
    HttpContent contents = SerialiseModelData(model); 
    var resultTask = client.PostAsync(url, contents); 

    return resultTask; 
}