2016-05-23 1 views
0

У меня проблема с методами async. Мой код выглядит следующим образом:Синхронизировать методы асинхронизации

var bid = await _applicationDataService.GetSnapshotFromServerAsync(b.BidId.ToString(), b.BidVersion); 

if (bid != null) 
{ 
    if (await _bidManagerService.CheckIfBidExistsInLocalDbAsync(bid.BidId, bid.BidVersion)) 
    { 
     await _bidManagerService.OverrideBidInLocalDbAsync(bid); 
    } 
    else 
    { 
     await _bidManagerService.SaveBidInLocalDbAsync(bid); 
    } 
} 

и в другом месте в проекте у меня есть:

await _bidContext.LoadBidByIdAsync(bidId.Value); 

Проблема заключается в том, что объект еще не может быть сохранен локально, но метод будет пытаться загрузить Это. Мне нужно как-то ждать, пока первый блок не закончит загрузку и сохранение, а затем мне нужно запустить второй блок.

Я не могу заморозить главную угрозу, потому что пользовательский интерфейс не будет реагировать.

я нашел что-то вроде этого:

  1. http://blogs.msdn.com/b/pfxteam/archive/2012/02/11/10266923.aspx

  2. https://msdn.microsoft.com/en-us/magazine/jj991977.aspx

+1

Это не имеет никакого отношения к 'async'. Если вы пытаетесь загрузить данные из * другого * потока, вам необходимо синхронизировать доступ. Или просто * не используйте другой поток. Если ваши методы действительно асинхронны, они не будут блокировать пользовательский интерфейс. Используете ли вы опрос для загрузки нового объекта из другого потока? –

+0

Да, вам нужен какой-то «AsyncManualResetEvent» или «AsyncAutoResetEvent» (используйте его в первой ссылке). Подождите события во втором блоке и установите сигнал после завершения первого блока. Все готово. –

+0

Голосование, чтобы закрыть; самый простой ответ - просто «подождать» первого блока, прежде чем разрешить запуск второго блока. Или возьмите «Задачу». Или 'AsyncLazy '. Или 'СемафорСлим'. Нужно больше контекста, чтобы определить, какой из них будет лучше. –

ответ

-1

ОК, так что я сделал это с помощью:

await Task.Run(); 

И в методе Run я прошел async() => {my methods}; Пользовательский интерфейс ждет этого, и он работает достаточно хорошо. У меня к моей логике к несчастью.

AutoResetEvent не работает для меня.

Смежные вопросы