Приложение C # не закрывается правильно (все еще работает в памяти после закрытия формы) - PullRequest
3 голосов
/ 16 июня 2011

У меня странная ситуация, когда мой процесс приложения все еще остается в памяти после закрытия основной формы, мой код Program.cs ниже:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;

namespace WindowsFormsApplication1
{
    static class Program
    {    
        [Flags]
        enum MoveFileFlags
        {
            None = 0,
            ReplaceExisting = 1,
            CopyAllowed = 2,
            DelayUntilReboot = 4,
            WriteThrough = 8,
            CreateHardlink = 16,
            FailIfNotTrackable = 32,
        }

        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        static extern bool MoveFileEx(
            string lpExistingFileName,
            string lpNewFileName,
            MoveFileFlags dwFlags
        );

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
        string lockFile = "run.dat";
        if (!File.Exists(lockFile))
        {
            // that's a first run after the reboot => create the file
            File.WriteAllText(lockFile, "");

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form2());
        }
        else
        {
            // that's a consecutive run      
        }
          Application.Run(new Form1());
        }
    }
}

Ответы [ 4 ]

5 голосов
/ 16 июня 2011

У вас должен быть только один Application.Run, чтобы гарантировать, что в текущем потоке есть только один цикл сообщений, и избежать проблемы, которую вы описываете.

2 голосов
/ 16 июня 2011

Обычно это указывает на фоновый поток, который не завершился.

1 голос
/ 20 июля 2011

Я решил свою ситуацию. Прочитайте эту статью для подробностей.

Я поместил критическую часть в собственный поток. Тема установлена ​​на Thread.IsBackground = True Теперь DotNet удается убить этот поток при выходе из приложения.

Dim thStart As New System.Threading.ParameterizedThreadStart(AddressOf UpdateImageInGuiAsync)
Dim th As New System.Threading.Thread(thStart)
th.Start() 
th.IsBackground = True

Background thread Привет

1 голос
/ 16 июня 2011

Если файл блокировки не существует, запускается новая «основная форма». Я думаю, Form1 является скрытой формой при запуске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...