2010-10-12 35 views
4

我有一个长期的C#.NET 3.5应用程序“冻结”,我很茫然。有两个C#可执行文件。一个有完整的UI,另一个作为托盘应用程序运行。他们都通过WCF与第三个服务应用进行通信,该应用也在托盘中运行。调试阻塞的Windows消息循环的想法

随机主Winforms应用程序的UI线程将死锁。神秘的是,如果我退出托盘应用程序,这个应用程序的用户界面将解锁。

每当我将调试器连接到任一应用程序时,我什么都不会有用。 UI线程在Application.Run方法的冻结应用程序中被阻止。所有其他线程或者正在休眠,或者在调用UI线程时被阻塞。

神秘地另一个像Photoshop一样运行的应用程序会表现出奇怪的行为,而这种僵局已经到位。退出托盘应用也会对此进行分类。

我可以推论的是,主要的Windows级别的消息泵出了问题,但我并不真正了解如何进一步调试。我已经安装了框架源代码,可以看到胶着应用是停留在一个while循环中:

Application.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop

,但真的不知道够做任何事此信息。

有没有人有任何建议在哪里看得更远?我一直在追逐这个随机的僵局错误数月。

感谢, 尼克

+1

该问题可能与WCF有关。你如何主办服务?你使用双工通信吗? – 2010-10-12 12:16:25

+0

是的,我们正在使用双工WCF。我们刚刚将代码移植到了.NET 4中,但仍然看到了这个问题,尽管不太经常。 随着WCF我做一些事情,使每个连接都有它自己的实例: [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,UseSynchronizationContext =假,InstanceContextMode = InstanceContextMode.PerSession)] 和回调普遍得到放入排队系统,所以他们不应该阻止。即使没有发生回调或服务调用,这个问题似乎也会发生,除了可能每5分钟发生一次“保持活跃”的Ping。 – Mocl 2010-11-02 10:12:08

回答

2

我认为这可能是一个红色的鲱鱼,因为这是一个在Visual Studio SDK所以真的是你的调试冻结。

我不得不调试一些工作相关/工作无关的冻结,他们是非常非常讨厌,需要细致的仪器和代码审查。所以要耐心等待!

下面是咨询了几件从我:

1)你会看到在路上几个红鲱鱼,所以要小心不要让窃听看不起他们,混淆问题的表现与原因本身。

2)这个冻结的时机是什么?多久时间?一个TCP连接超时通常需要23秒,而数据库连接超时30,一个命令120秒(在不同的设置可能会有所不同),所以所需要的时间是一个很大的线索。如果它本身无法解决,并且您必须关闭一个应用程序才能摆脱它,那几乎肯定是线程或数据库死锁。

3)使用sysinternal的进程管理器和进程监视器来查看他们正在做什么以及他们在什么时候冻结。最后一个圣礼可能不会总是给你一个提示。

4)我知道,让你找到问题的axact位置,从那时起,它通常需要几个小时到几天来发现问题,将需要一段时间,但开始写在你的代码跟踪。 5)如果你有更多的信息,发表另一个问题,并让我知道。

+0

谢谢你。因为它是随机的,你可能几天没有看到它,这是非常烦人的,但我会给这些想法一个去。再次感谢。 – Mocl 2010-11-02 10:14:16

+0

没有probs。如果你有更多的信息,但仍然没有解决方案,分享,我会看看。 – Aliostad 2010-11-02 10:16:41