背景:我有一个运行在Windows和Windows PosReady 2009 PC上的.Net 3.5WPF“棱镜”-based应用程序。这个应用程序运行在每天晚上都会关闭的个人电脑上(通过C#呼叫"shutdown.exe"),并在早上(通过局域网上的唤醒)重新启动。该应用程序是基于触摸(使用ELO触摸屏),没有鼠标或键盘连接,用户不能访问Windows。
发布:我们偶尔会看到两种情况之一发生的问题;或者应用程序似乎没有正确加载,我们看到一个空白的白色表单显示,或者它停止了对触摸的响应。通过查看我们的(log4net)日志,我们可以看到,我们仍然在处理触摸事件,并在这两种情况下记录它们。这种情况通常发生在切换视图时,我们还在日志中看到Prism RegionManager正在适当地删除和添加视图。
Troubleshooting:应用程序正在使用Clonezilla应用的图像在大约100台PC上运行,这种情况只偶尔发生。因为它并不是发生在所有的PC上,而且没有任何异常记录,或者任何显示事件查看器问题的东西,我们已经诉诸于更多的PC和OS级别的修复。具体来说,我们尝试重新启动应用程序和个人电脑,偶尔会有短期的成功--这意味着在这些重新启动之后,应用程序有时会正常工作,但最多只能运行几个小时。我们还假设应用程序已经损坏,我们已经删除并重新安装它,但没有成功。
唯一能解决这个问题的似乎是使用提供的.Net 3.5 SP1安装程序包修复SP1框架。
结论:由于这似乎解决了这个问题,而其他任何事情都没有解决,所以我们似乎在某种程度上破坏了GAC的框架dll --无论是通过代码还是PC上的引导/关闭过程。
问询:这将导致以下几个问题:
谢谢你的帮助。
发布于 2012-07-26 12:50:41
我们终于能够获得一台展示这种行为的生产机器,并通过许多故障排除步骤,包括向Microsoft发送转储文件,发现了该问题。
WPF字体缓存Windows服务偶尔会进入损坏状态,导致一个简单的缓存请求无限期地阻塞。此挂起导致了上述在我们的WPF应用程序中描述的所有行为。
简单的解决方案:停止并禁用服务。在禁用服务和重新启动PC之后,服务不再使用,我们没有看到任何这些问题。从理论上讲,这会导致更长的应用程序加载时间,但是我们已经看到了零的负面影响。
注意,该服务有两个版本: 3.0.0.0和4.0.0.0。如果应用程序的目标是.Net 3.0或3.5,则需要禁用3服务,如果以4.0+为目标,则需要禁用4服务。
感谢大家的意见和建议。
发布于 2012-02-18 07:12:43
当我们连接触摸屏时,我们在WPF应用程序中提醒您的问题。这是由于.Net中的自动化框架中有一个错误。它导致我们的应用程序变得非常慢,或者完全挂起GUI线程。
您可以在:http://social.msdn.microsoft.com/Forums/en-IE/windowsaccessibilityandautomation/thread/6c4465e2-207c-4277-a67f-e0f55eff0110上阅读有关此问题的更多信息。
上面的线程中建议的解决方法是,删除自动化事件的任何侦听器,这些侦听器定期为我们工作。
这不是一个真正的答案,但既然我没有足够的代表?(我猜)我不能使用注释函数:)
发布于 2012-02-21 16:56:32
尝试全局错误捕获并查看它会产生什么。
public partial class App : Application
{
[STAThread]
public static void Main()
{
var application = new App();
application.DispatcherUnhandledException +=
new DispatcherUnhandledExceptionEventHandler(application_DispatcherUnhandledException);
application.InitializeComponent();
application.Run();
}
static void application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
LogAndClose("Global exception: " + e.Exception.ToString());
}
public static void Log(string text)
{
try
{
System.IO.File.AppendAllText(Environment.CurrentDirectory + "\\Log.txt",
"[" + DateTime.Now.ToString("MM/dd/yy HH:mm:ss") + "] " + text + "\r\n");
}
catch { }
}
public static void LogAndClose(string text)
{
Log(text);
try
{
Application.Current.Shutdown();
}
catch { }
}
}
https://stackoverflow.com/questions/9242174
复制相似问题