0

所以我正在使用一些异步方法开发一个 Windows 8 应用程序。在一个特定的地方,我需要应用程序等待异步方法完成,但它似乎没有发送 EventHandle 它的状态。

以下是需要协同工作的方法:

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(),它完全停止工作

4

3 回答 3

0

简而言之,您不应该使用异步并等待某些东西。标准错误是等待返回的任务(死锁)。您对此做了一个变体:您创建了一个事件并等待它(也是死锁)。

解决方案:要么接受 async-await,要么根本不做 async。(通常)不能以混合方式同时进行。

如果您可以使用 await,这是一个好的开始:

await LoadFacebookData(parameters);

摆脱事件。

于 2013-01-27T14:46:47.503 回答
0

我建议你使用

await LoadFacebookData(parameters);

代码行以在异步操作完成后在启动的同一线程上继续执行。

于 2013-01-27T14:47:02.427 回答
0

据我所知,您发布的代码没有任何问题。这使我相信问题出在您已注释掉的代码中。问题可能是您的代码执行永远不会到达该行

handle.Set();

这可能是因为异常,或者您的异步代码根本无法完成。要“处理”异常的可能性,您可能应该使用任务对象的内置等待方法,而不是您自己的 EventWaitHandle。

您可以将 EventWaitHandle 作为一个整体移除,只需执行以下操作:

LoadFacebookData(parameters).Wait();

这将传播在线程内发生的任何异常。

于 2013-01-27T15:01:49.477 回答