繁体   English   中英

我的EventWaithandle出了点问题,它不会变为已发出信号吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM