Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的EventWaithandle出了问题,它没有';你不能换成信号灯吗?_C#_Asynchronous_Event Handling - Fatal编程技术网

C# 我的EventWaithandle出了问题,它没有';你不能换成信号灯吗?

C# 我的EventWaithandle出了问题,它没有';你不能换成信号灯吗?,c#,asynchronous,event-handling,C#,Asynchronous,Event Handling,因此,我正在使用一些异步方法开发一个Windows8应用程序。 在一个特定的地方,我需要应用程序等待异步方法完成,但它似乎并不发送EventHandle,而是发送它的状态 以下是需要协同工作的方法: public class Film : Page private User loggedinUser = new User(); private EventWaitHandle handle = new AutoResetEvent(false); private dynamic paramete

因此,我正在使用一些异步方法开发一个Windows8应用程序。 在一个特定的地方,我需要应用程序等待异步方法完成,但它似乎并不发送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
} 

代码点击
句柄.WaitOne()
位的那一刻,它就完全停止工作了

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

解决方案:要么接受异步等待,要么根本不做异步。不能在混合样式中同时使用这两种样式(通常)

如果您可以使用Wait,这是一个良好的开端:

await LoadFacebookData(parameters);

摆脱该事件。

我建议您使用

await LoadFacebookData(parameters);

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

据我所知,您发布的代码没有任何问题。这让我相信问题出在您注释掉的代码中。问题可能是您的代码执行从未达到目标

handle.Set();
这可能是由于异常,或者您的异步代码根本无法完成。要“处理”异常的可能性,您可能应该使用Task对象的内置Wait方法,而不是您自己的EventWaitHandle

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

LoadFacebookData(parameters).Wait();

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

执行是否命中
句柄.Set()行?如果您使用的是
async
关键字,为什么不
等待LoadFacebookData(参数)而不是使用等待处理程序?这怎么会是死锁?我无法想象任何执行流会使提供给我们的代码陷入死锁。在我看来(尽管我可能弄错了),这不起作用的原因一定是来自facebook的´//async代码。对于引用,这很好:将async与非async代码混合使用没有问题(通常,要使用async实际上是必需的,因为main方法不能是async的,但这通常对您是隐藏的).@Alxandr ASP.NET有一个同步上下文,您无法在该控制台应用程序中重新创建它。异步方法将向其发布,并且发布会在内部等待,
WaitOne
完成。死锁。ASP.NET尝试使您的代码单线程且无可重入性(可取!)。好吧,我不完全确定该示例是否足够(您提出了一个有效的观点),但是
newsynchronizationcontext().Send(o=>new AsyncTest().Run(),null);
仍然有效……您使用了什么“context”呢?下面是一个有用的表:在OPs代码中,未显示的异步代码返回到线程池中,无法进入synctx。