我继承了一些我一直在更新的Windows移动代码。我遇到了一个奇怪的错误,我希望即使有点模糊,也许它会引起别人的记忆:
运行应用程序(基本上是带有P / Invoke gps代码的美化Forms应用程序),我切换到任务管理器,并通过End Task关闭应用程序。似乎退出正常(没有错误并从任务管理器中消失)。不幸的是,应用程序拒绝重新启动,直到我重新启动手机或重新安装CAB。
更糟糕的是:这个bug在HTC Diamond上是可重现的,但在HTC HD2上工作正常(即可以在EndTask之后再次运行)。
我唯一能想到的是Dispose()和任务管理器之间的某种时间竞争。有什么想法吗?
我也在考虑一种解决方法 - 我确实有一个正常工作的“退出应用程序”例程,可以正确清理应用程序;我可以在c#代码中捕获EndTask事件以完成正确的清理吗?
也许我只是错过了痛点...欢迎所有想法:)
答案 0 :(得分:4)
使用TaskManager关闭它时,会发生以下情况:
如果您运行的工作线程未退出,则该过程通常不会完全终止。这在CF 1.0中非常常见,其中线程的IsBackground属性不存在。
由于TaskManager仅枚举表单标题,如果表单全部关闭,即使进程正在运行,它也不会显示应用程序。当你再次尝试执行时,shell会检测到它已经在运行并且只是转到正在运行(没有UI)的过程,所以看起来什么也没发生。
您可以使用远程进程查看器验证此行为。
解决方案是修复您的工作线程代码以正确退出。通常我使用布尔值或WaitHandle来表示它们应该退出。对于所有创建的线程,也应该将IsBackground设置为true。
答案 1 :(得分:1)
自你的问题已经过去了一年,但这可能就是答案。
我遇到了同样的问题。我的应用程序有MinimizeBox = False,这在窗体的右上角显示一个小的Ok,是处理Closing Event的唯一方法(Cross with MinimizeBox = True不会引发ClosingEvent)。在这种情况下,我取消了结束并执行一些自定义代码并最小化表单,使其看起来像标准的“交叉关闭事物”行为。
问题是在htc diamond上,当你杀死一个任务时它会引发相同的结束事件,我的代码再次取消它。奇怪的是,在任务管理器中,应用程序已经消失,但如果您启动原始Microsoft任务管理器(/windows/taskmgr.exe)并在菜单中选择show processes,那么您会看到您的应用程序仍在运行。这就是为什么你不能再次启动它。奇怪的是在HD2上,它与关闭事件具有相同的行为,但它似乎也强制对应用程序进行暴力破坏,所以没问题。
解决方案: 您只需要一点bool来了解您的应用是在前台还是在表单激活事件中设置为true的背景上,以及在停用事件时设置为false。在结束活动中,只有当你的应用程序在前台时才能取消,你可以运行你的特殊代码,否则让表格关闭,这是一个杀戮!!!
[DllImport("coredll.dll")]
static extern int ShowWindow(IntPtr hWnd, int nCmdShow);
const int SW_MINIMIZED = 6;
public static void MinimizeForm(IntPtr pFormHandle)
{
ShowWindow(pFormHandle,SW_MINIMIZED);
}
private bool m_IsFormVisible = false;
void m_MainForm_Deactivate(object sender, EventArgs e)
{
m_IsFormVisible = false;
}
void m_MainForm_Activated(object sender, EventArgs e)
{
m_IsFormVisible = true;
}
void m_MainForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (m_IsFormVisible)//very important !
{
e.Cancel = true;
//do something if you want
//minimize the form yourself
MinimizeForm(s_Instance.m_MainForm.Handle);
}
}
答案 2 :(得分:0)
我不确切知道你的问题是什么,但我发现WinCE设备往往只允许一个应用程序的一个实例同时运行。这可能意味着TaskManager没有正确清理应用程序,因此它认为它仍在运行并且没有启动另一个副本,或者它实际上可能仍在运行。
尝试在应用程序中放入一些代码,以检测它是否已在运行。 另外,请仔细检查是否存在正确清理所有内容,尤其是线程等,因为Windows关闭应用程序的时间可能与您手动执行时不同。
希望其中任何一个有帮助