[英]Something is going wrong with my EventWaithandle, it doesn't change to signaled?
因此,我正在使用一些异步方法来开发Windows 8应用程序。 在一个特定的地方,我需要应用程序来等待async方法完成,但是似乎它没有将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()
的那一刻, handle.WaitOne()
位,它将完全停止工作
简而言之,您不应该使用异步并等待某些东西。 标准错误是等待返回的任务(死锁)。 您对此做了一个变体:创建了一个事件并等待它(也是死锁)。
解决方案:要么接受异步等待,要么根本不做异步。 不能同时使用混合样式(通常)。
如果您可以使用await,这是一个不错的开始:
await LoadFacebookData(parameters);
摆脱事件。
我建议您使用
await LoadFacebookData(parameters);
异步操作完成后,使代码行在与启动线程相同的线程上继续执行。
据我所知,您发布的代码没有错。 这使我相信问题出在您已注释掉的代码中。 问题可能是您的代码执行永远无法完成
handle.Set();
这可能是由于异常,或者您的异步代码根本无法完成。 要“处理”异常的可能性,您可能应该使用Task对象的内置Wait方法,而不是您自己的EventWaitHandle。
您可以将EventWaitHandle整体删除,只需执行以下操作:
LoadFacebookData(parameters).Wait();
这将传播线程中发生的所有异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.