我的 EventWaithandle 出现问题,它不会更改为信号

本文关键字:信号 EventWaithandle 问题 我的 | 更新日期: 2023-09-27 17:56:08

所以我正在使用一些异步方法开发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()位时,它完全停止工作

我的 EventWaithandle 出现问题,它不会更改为信号

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

解决方案:要么接受异步等待,要么根本不做异步。不能在混合风格中同时做到这两点(通常)。

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

await LoadFacebookData(parameters);

摆脱事件。

我建议你使用

await LoadFacebookData(parameters);

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

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

handle.Set();

这可能是因为异常,或者您的异步代码永远不会完成。为了"处理"异常的可能性,您可能应该使用 Task-对象的内置 Wait-方法,而不是您自己的 EventWaitHandle。

您可以整体删除 EventWaitHandle,只需执行以下操作:

LoadFacebookData(parameters).Wait();

这将传播其中线程中发生的任何异常。