C# 我的EventWaithandle出了问题,它没有';你不能换成信号灯吗?
因此,我正在使用一些异步方法开发一个Windows8应用程序。 在一个特定的地方,我需要应用程序等待异步方法完成,但它似乎并不发送EventHandle,而是发送它的状态 以下是需要协同工作的方法: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
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。