所以我正在使用一些异步方法开发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()
位时,它完全停止工作
简而言之,您不应该使用异步并等待某些东西。标准错误是等待返回的任务(死锁)。你对此做了一个变化:你创建了一个事件并等待它(也是死锁)。
解决方案:要么接受异步等待,要么根本不做异步。不能在混合风格中同时做到这两点(通常)。
如果您可以使用 await,这是一个好的开始:
await LoadFacebookData(parameters);
摆脱事件。
我建议你使用
await LoadFacebookData(parameters);
代码行,以便在异步操作完成后在启动的同一线程上继续执行。
据我所知,您发布的代码没有任何问题。这让我相信问题出在您注释掉的代码中。问题可能是您的代码执行永远不会到达该行
handle.Set();
这可能是因为异常,或者您的异步代码永远不会完成。为了"处理"异常的可能性,您可能应该使用 Task-对象的内置 Wait-方法,而不是您自己的 EventWaitHandle。
您可以整体删除 EventWaitHandle,只需执行以下操作:
LoadFacebookData(parameters).Wait();
这将传播其中线程中发生的任何异常。