C# Windows mobile应用程序赢得';被任务管理器关闭后无法运行

C# Windows mobile应用程序赢得';被任务管理器关闭后无法运行,c#,windows-mobile,compact-framework,taskmanager,C#,Windows Mobile,Compact Framework,Taskmanager,我继承了一些我一直在更新的windows mobile代码。我遇到了一个奇怪的bug,我希望即使有点模糊,它也能激发某人的记忆: 运行应用程序(这基本上是一个带有p/Invoke gps代码的美化表单应用程序),我切换到任务管理器,并通过End task关闭应用程序。似乎退出良好(没有错误,并从任务管理器中消失)。不幸的是,在我重新启动手机或重新安装CAB之前,该应用程序拒绝再次启动 更糟糕的是:这个bug可以在HTC Diamond上重现,但在HTC HD2上运行良好(即可以在EndTask之

我继承了一些我一直在更新的windows mobile代码。我遇到了一个奇怪的bug,我希望即使有点模糊,它也能激发某人的记忆:

运行应用程序(这基本上是一个带有p/Invoke gps代码的美化表单应用程序),我切换到任务管理器,并通过End task关闭应用程序。似乎退出良好(没有错误,并从任务管理器中消失)。不幸的是,在我重新启动手机或重新安装CAB之前,该应用程序拒绝再次启动

更糟糕的是:这个bug可以在HTC Diamond上重现,但在HTC HD2上运行良好(即可以在EndTask之后再次运行)

我唯一能想到的就是Dispose()和任务管理器之间的某种时间竞争。有什么想法吗

我也在考虑一个变通办法——我确实有一个正常工作的“退出应用程序”例程,可以正确地清理应用程序;我可以在c代码中捕获EndTask事件以完成正确的清理吗


也许我只是错过了痛点。。。欢迎所有想法:)

我不知道您的问题是什么,但我发现WinCE设备往往只允许一个应用程序的一个实例同时运行。这可能意味着TaskManager没有正确清理应用程序,因此认为它仍在运行,而没有启动另一个副本,或者,它实际上可能仍在运行

尝试在应用程序中添加一些代码,检测它是否已经在运行。 另外,请尝试再次检查您是否正确清理了存在的所有内容,尤其是线程等,因为windows关闭应用程序的时间可能与您手动操作的时间不同


我不知道你的问题到底是什么,但我发现WinCE设备往往只允许一个应用程序的一个实例同时运行。这可能意味着TaskManager没有正确清理应用程序,因此认为它仍在运行,而没有启动另一个副本,或者,它实际上可能仍在运行

尝试在应用程序中添加一些代码,检测它是否已经在运行。 另外,请尝试再次检查您是否正确清理了存在的所有内容,尤其是线程等,因为windows关闭应用程序的时间可能与您手动操作的时间不同


希望这些都有帮助

当您使用TaskManager关闭它时,会发生以下情况:

  • 应用程序表单将发送WM_关闭消息
  • 如果在一段时间后,它们仍在运行,则使用TerminateProcess
  • 如果正在运行的工作线程没有退出,则进程通常不会完全终止。这在CF 1.0中非常常见,因为在CF 1.0中,线程的IsBackground属性不存在

    由于TaskManager仅枚举表单标题,因此如果您的表单都已关闭,则即使流程正在运行,它也不会显示应用程序。当您再次尝试执行时,shell检测到它已经在运行,并简单地切换到正在运行(没有UI)的进程,因此看起来好像什么都没有发生

    您可以使用远程Process Viewer验证此行为


    解决方案是修复工作线程代码以正确退出。通常我使用布尔值或WaitHandle来表示它们应该退出。对于创建的所有线程,也应将IsBackground设置为true。

    使用TaskManager关闭它时,会发生以下情况:

  • 应用程序表单将发送WM_关闭消息
  • 如果在一段时间后,它们仍在运行,则使用TerminateProcess
  • 如果正在运行的工作线程没有退出,则进程通常不会完全终止。这在CF 1.0中非常常见,因为在CF 1.0中,线程的IsBackground属性不存在

    由于TaskManager仅枚举表单标题,因此如果您的表单都已关闭,则即使流程正在运行,它也不会显示应用程序。当您再次尝试执行时,shell检测到它已经在运行,并简单地切换到正在运行(没有UI)的进程,因此看起来好像什么都没有发生

    您可以使用远程Process Viewer验证此行为


    解决方案是修复工作线程代码以正确退出。通常我使用布尔值或WaitHandle来表示它们应该退出。对于创建的所有线程,也应该将IsBackground设置为true。

    您的问题已经提出一年了,但这可能就是答案

    我也有同样的问题。我的应用程序有MinimizeBox=False,这在表单的右上角显示一个小Ok,这是处理关闭事件的唯一方法(MinimizeBox=True的十字不会引发ClosingEvent)。在这种情况下,我取消关闭,并执行一些自定义代码,最小化表单,使其看起来像标准的“交叉关闭”行为

    问题是,在htc diamond上,当您终止一个任务时,它会引发相同的结束事件,而我的代码会再次取消它。奇怪的是,在任务管理器中,应用程序已消失,但如果启动原始的Microsoft任务管理器(/windows/taskmgr.exe)并在菜单中选择“显示进程”,则您会看到应用程序仍在运行。这就是你不能再发射它的原因。奇怪的是,在HD2上,它与关闭事件具有相同的行为,但它似乎也在应用程序上强制执行暴力杀戮,所以没有问题

    解决方案: 你只需要一点bool就可以知道你的应用程序是在前台还是后台,你在activate事件中设置为true,在deactivate事件中设置为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);
        }
    }
    

    你的问题已经问了一年了,但这可能是答案

    我也有同样的问题。我的应用程序有MinimizeBox=False,这在表单的右上角显示一个小Ok,这是处理关闭事件(带Minim的十字架)的唯一方法