2013-01-27 2 views
0

Итак, я работаю над приложением Windows 8 с некоторыми асинхронными методами. В одном конкретном месте мне нужно приложение, чтобы дождаться завершения асинхронного метода, но, похоже, он не отправляет состояние EventHandle.Что-то не так с моим EventWaithandle, оно не меняется на сигнализацию?

Вот методы, которые должны работать вместе:

public class Film : Page 

private User loggedinUser = new User(); 
private EventWaitHandle handle = new AutoResetEvent(false); 
private dynamic parameters; 

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    this.parameters = e.Parameter; 
    LoadFacebookData(parameters); 
    handle.WaitOne(); 
    LoadUserMovies(loggedinUser.UserName); 

} 

private async void LoadFacebookData(dynamic parameter) 
{ 
    //async code that gets info from facebook whichs determines what user is logged in 
    handle.Set(); 
} 

private void LoadUserMovies(string username) 
{ 
    // irrelevant code 
} 

момент код попадает в handle.WaitOne() немного, он перестает полностью

+0

Выполняет ли выполнение обращение к строке 'handle.Set();'? – AgentFire

+0

Если вы используете ключевое слово 'async', почему вы просто не ждёте LoadFacebookData (parameters);' вместо использования обработчиков wait? – AgentFire

ответ

0

Короче работать вы не должны использовать асинхр и ждать что нибудь. Стандартной ошибкой является ожидание возвращенной задачи (тупика). Вы сделали вариацию: вы создали событие и ждали его (также тупик).

Решение: Либо объять асинхронным ожиданием, либо вообще не выполнять асинхронную работу. Невозможно сделать оба в смешанном стиле (обычно).

Если Await доступен вам, это хорошее начало:

await LoadFacebookData(parameters); 

Избавиться от события.

+0

Как это тупик? Я не могу представить ни одного потока выполнения, который заставил бы код дать нам тупик. В моей голове (хотя я и ошибаюсь) причина, по которой это не работает, должна быть в // async-коде, который получается из facebook. – Alxandr

+0

Для справок это работает отлично: http://monobin.com/1548/ Нет проблем с перемешиванием async с не-асинхронным кодом (в общем, для использования async вообще требуется, потому что основной метод может 't быть асинхронным, но это, как правило, скрыто от вас). – Alxandr

+0

@Alxandr ASP.NET имеет текст синхронизации, который нельзя воспроизвести в этом консольном приложении. Асинхронный метод отправляется на него, и почта внутренне ждет, пока не завершится 'WaitOne'. Тупик. ASP.NET пытается сделать ваш код однопоточным и без повторения (желательно!). – usr

0

Я предлагаю вам использовать строку кода

await LoadFacebookData(parameters); 

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

0

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

handle.Set(); 

Это может быть из-за исключения, или ваш код асинхронной просто никогда не завершается. Чтобы «иметь дело» с возможностью исключения, вы, вероятно, должны использовать встроенный метод Wait объекта Task, а не собственный EventWaitHandle.

Вы можете удалить EventWaitHandle в целом, а просто сделать:

LoadFacebookData(parameters).Wait(); 

Это будет распространяться какие-либо исключения, которые происходят в потоке внутри.

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