Jak ponownie uruchomić aplikację C # WinForm?


86

Tworzenie aplikacji WinForm w języku C # .NET 2.0. Potrzebujesz aplikacji do zamknięcia i ponownego uruchomienia.

Application.Restart();

Powyższa metoda okazała się zawodna .

Jaki jest lepszy sposób na ponowne uruchomienie aplikacji?


3
Ciekawi mnie konieczność ponownego uruchomienia aplikacji. Nigdy wcześniej nie myślałem o tej potrzebie. Jakie są twoje okoliczności?
JeffH

Nasza szczególna okoliczność - aplikacja odtwarzacza multimedialnego, która ma przeglądać niektóre obrazy i zawartość flash w pętli. Powinien działać przez wiele dni bez ponownego uruchamiania komputera i bez klawiatury / myszy, więc nie ma interakcji z użytkownikiem. Jeśli program się zawiesi (nieobsługiwany wyjątek), należy ponownie uruchomić program, nie wychodzić ani nie wyświetlać błędu. stackoverflow.com/questions/773768/… Zobacz, dlaczego program ma wyjątki, którym nie mogę zapobiec. :(
Adam Nofsinger

1
Ostatecznie znacznie lepszym rozwiązaniem dla naszej aplikacji było stworzenie małej aplikacji Watchdog, która jest uruchamiana (jeśli jeszcze nie działa) z głównej aplikacji. Watchdog po prostu sprawdza co około 10 sekund, aby sprawdzić, czy główna aplikacja nadal ma uruchomiony proces, a jeśli nie, uruchamia go. Prosty, elegancki i znacznie mocniejszy niż próba ponownego uruchomienia z głównej aplikacji.
Adam Nofsinger

2
Innym powodem ponownego uruchomienia jest zmiana języka lub pobranie aktualizacji.
Andrew Truckle,

1
Ale co, jeśli ... Aplikacja watchdog ulegnie awarii?
Metoniem

Odpowiedzi:


39

Niestety nie możesz użyć Process.Start () do uruchomienia instancji aktualnie działającego procesu. Zgodnie z dokumentacją Process.Start (): "Jeśli proces już działa, nie jest uruchamiany żaden dodatkowy zasób procesu ..."

Ta technika będzie działać dobrze w debugerze VS (ponieważ VS wykonuje jakąś magię, która powoduje, że Process.Start myśli, że proces nie jest już uruchomiony), ale zakończy się niepowodzeniem, jeśli nie zostanie uruchomiony w debugerze. (Zauważ, że może to być specyficzne dla systemu operacyjnego - wydaje mi się, że pamiętam, że w niektórych moich testach działało na XP lub Vista, ale może po prostu pamiętam uruchamianie go pod debugerem).

Ta technika jest dokładnie tą, której użył ostatni programista w projekcie, nad którym obecnie pracuję, i od jakiegoś czasu próbuję znaleźć obejście tego problemu. Jak dotąd znalazłem tylko jedno rozwiązanie i wydaje mi się po prostu brudne i niezdarne: uruchom drugą aplikację, która czeka w tle na zakończenie pierwszej aplikacji, a następnie ponownie uruchamia pierwszą aplikację. Jestem pewien, że to zadziała, ale fuj.

Edycja: Korzystanie z drugiej aplikacji działa. W drugiej aplikacji zrobiłem tylko:

    static void RestartApp(int pid, string applicationName )
    {
        // Wait for the process to terminate
        Process process = null;
        try
        {
            process = Process.GetProcessById(pid);
            process.WaitForExit(1000);
        }
        catch (ArgumentException ex)
        {
            // ArgumentException to indicate that the 
            // process doesn't exist?   LAME!!
        }
        Process.Start(applicationName, "");
    }

(To jest bardzo uproszczony przykład. Prawdziwy kod ma wiele funkcji sprawdzania poprawności, obsługi błędów itp.)


Zgadzam się z HiredMind i faktycznie poszedłem z tą samą implementacją "programu Watchdog" wkrótce po napisaniu odpowiedzi. Przepraszamy, powinienem tu wrócić i zaktualizować. Nie sądzę, że powinno to być zbyt okropnie brzydkie / obrzydliwe / brudne. Wzorzec programu Watchdog jest dość szeroko stosowany.
Adam Nofsinger

W rzeczywistości nie potrzebujesz drugiej aplikacji na dysku ... możesz użyć skryptu i wygenerować go w locie z tymczasową nazwą ... Myślę, że może to złagodzić poczucie winy, mając drugą aplikację w celu ponownego uruchomienia własne ... Albo można „emitować” cała C # aplikacji, skompilować go, zapisz go na dysku i uruchomić go (brudny, brudny myślenia) ..
Loudenvier

Pierwszy akapit jest nieprawidłowy: Process.Startnie dotyczy listy uruchomionych procesów systemu operacyjnego. To stwierdzenie dokumentacja mówi tylko o tej instancji obiektu z Processklasy. ProcessKlasa może być dołączony do uruchomionego procesu, ale może być również w stanie przed startem. Moim zdaniem to błąd konstrukcyjny. Najlepszą praktyką, IMO, jest nigdy ponowne używanie Process instancji i natychmiastowe jej uruchomienie po utworzeniu. Najlepiej użyć Process.Startmetody statycznej . Wtedy ta wada dokumentacji i projektu nigdy nie wchodzi w grę.
usr

Kod pokazany tutaj jest również niewiarygodny z powodu WaitForExit(1000). Ale całe czekanie nie jest konieczne, aby rozpocząć nowy proces. Może to być dodatkowe zachowanie, które chcesz, ale nie jest wymagane rozpoczęcie nowego procesu.
usr

Nie wiem jak teraz, ale dziewięć lat temu (ahem) było to zdecydowanie poprawne. :-)
HiredMind

72

O wiele prostsze podejście, które się sprawdziło, to:

Application.Restart();
Environment.Exit(0);

Zachowuje to argumenty wiersza polecenia i działa pomimo programów obsługi zdarzeń, które normalnie uniemożliwiają zamknięcie aplikacji.

Wywołanie Restart () próbuje wyjść, mimo to uruchamia nową instancję i wraca. Następnie wywołanie Exit () kończy proces, nie dając żadnej obsłudze zdarzeń szansy na uruchomienie. Jest bardzo krótki okres, w którym działają oba procesy, co nie stanowi problemu w moim przypadku, ale może w innych przypadkach.

Kod zakończenia 0 w Environment.Exit(0);określa czyste zamknięcie. Możesz również wyjść z 1, aby określić, że wystąpił błąd.


Prosty, ale niezawodny. To powinna być akceptowana odpowiedź. Próbowałem zaimplementować funkcję wylogowania, która opróżni wszystkie zmienne globalne i będzie wyglądać tak, jakby aplikacja właśnie się uruchomiła. Chciałem po prostu pokazać panel logowania i zresetować wszystkie zmienne globalne, które przechowują ważne informacje z DB na nic. To znacznie uprościło życie. Dzięki!
DavidG

System.Windows.Forms.Application.Restart () działa również w aplikacjach WPF. Przetestowano z systemem operacyjnym Windows 10.
NthDeveloper

Whaaaat ?! Żartujesz ... prawda? C # <3. Pamiętaj, że domyślnie nie spowoduje to wywołania OnClose()zdarzeń formularza i podobnych.
F8ER

56

Jeśli jesteś w głównej formie aplikacji, spróbuj użyć

System.Diagnostics.Process.Start( Application.ExecutablePath); // to start new instance of application
this.Close(); //to turn off current app

7
Jest podobnie, ale inaczej. Application.Exit nie działało u mnie, a this.Close () wykonało zadanie.
Darqer

1
May Enviorment.Exit(0)też wykona robotę.
Dwza

2
Enviorment.Exitjest brudnym i dość inwazyjnym wyjściem, ponieważ uniemożliwia uruchomienie kodu czyszczącego aplikację. Przez większość czasu nie jest to właściwy wybór.
usr

16

Mogę się spóźnić na imprezę, ale oto moje proste rozwiązanie i działa jak urok w każdej aplikacji, którą mam:

        try
        {
            //run the program again and close this one
            Process.Start(Application.StartupPath + "\\blabla.exe"); 
            //or you can use Application.ExecutablePath

            //close this one
            Process.GetCurrentProcess().Kill();
        }
        catch
        { }

Działa bardzo dobrze na Win-7-x64 i Win-XP-x32. Nie widzę nic o żadnych ograniczeniach w dokumentach . To powinna być akceptowana odpowiedź.
Bitterblue

@Bitterblue Łącze do opublikowanych przez Ciebie dokumentów brzmi: „Jeśli proces jest już uruchomiony, żadne dodatkowe zasoby procesu nie są uruchamiane”. To trzecia linia w sekcji uwag. Chciałbym, żeby tak nie było, ale tak jest.
HiredMind

@HiredMind Myślę, że moglibyśmy się spierać o to, co „ograniczenia” oznaczają dla każdego z nas. Ale sekcja nosi tytuł „Uwagi”, a nie „Ograniczenia”. Więc mogę z tym żyć. A dlaczego wolisz, żeby tak nie było? Czy miałeś z tym jakieś problemy? Ponieważ tego nie zrobiłem. U mnie działa bez zarzutu.
Bitterblue

@HiredMind To nic osobistego ani nic innego, ale pomysł użycia drugiej aplikacji lub skryptu tylko do ponownego uruchomienia mojej aplikacji C # jest dla mnie odpychający. Win7 wykonuje tę metodę w trybie wydania do tej pory bezbłędnie (używam jej do ponownego uruchomienia mojej aplikacji, gdy użytkownik zmieni język = nic ważnego). Dlatego wolałbym powiedzieć użytkownikowi, aby ponownie uruchomił aplikację ręcznie, niż używać metod, których nie akceptuję. W przeszłości korzystałem ze skryptów i zupełnie mi się to nie podobało.
Bitterblue

@BitterBlue Zgadzam się, że korzystanie z drugiej aplikacji jest do bani - powiedziałem to w mojej odpowiedzi. Ale czy wypróbowałeś metodę pojedynczej aplikacji poza debugerem? Po pozostawieniu tej odpowiedzi nie działał w niektórych wersjach systemu Windows, a tryb wydania lub debugowania nie miał z tym nic wspólnego. Jeśli to działa, świetnie! Ale ten problem mnie ugryzł i dostałem setki wściekłych użytkowników.
HiredMind

12

Miałem dokładnie ten sam problem i ja również miałem wymóg zapobiegania zduplikowanym instancjom - proponuję alternatywne rozwiązanie do tego, które proponuje HiredMind (które będzie działać dobrze).

To, co robię, to uruchamianie nowego procesu z processId starego procesu (tego, który wyzwala restart) jako argumentem wiersza cmd:

// Shut down the current app instance.
Application.Exit();

// Restart the app passing "/restart [processId]" as cmd line args
Process.Start(Application.ExecutablePath, "/restart" + Process.GetCurrentProcess().Id);

Następnie po uruchomieniu nowej aplikacji najpierw analizuję argumenty wiersza cm i sprawdzam, czy jest tam flaga restartu z processId, a następnie czekam, aż proces zakończy się:

if (_isRestart)
{
   try
   {
      // get old process and wait UP TO 5 secs then give up!
      Process oldProcess = Process.GetProcessById(_restartProcessId);
      oldProcess.WaitForExit(5000);
   }
   catch (Exception ex)
   { 
      // the process did not exist - probably already closed!
      //TODO: --> LOG
   }
}

Oczywiście nie pokazuję wszystkich kontroli bezpieczeństwa, które przeprowadziłem itp.

Nawet jeśli nie jest to idealne rozwiązanie - uważam to za ważną alternatywę, dzięki czemu nie musisz mieć osobnej aplikacji tylko do obsługi ponownego uruchomienia.


1
IMHO, że jest lepsze rozwiązanie tego problemu. Mam również wymóg posiadania pojedynczej instancji i umożliwienia użytkownikowi ponownego uruchomienia aplikacji (np. W przypadku jej awarii). Prawie zaimplementowałem Twoje rozwiązanie, jednak przyszło mi do głowy, że lepiej byłoby po prostu dodać inny argument wiersza poleceń, który umożliwia uruchamianie wielu instancji.
Dennis

mmm, odwracasz logikę - podoba mi się! Jedynym problemem jest to, że jeśli ktoś
odkryje

Cóż, miałem szczęście, że była to funkcja, o którą prosili użytkownicy, więc była to WIN-WIN. Wolałbym, żeby „znaleźli” /allowMultipleInstancesflagę niż raczej dziwną /restart.
Dennis

Tak, jeśli pozwolisz na wiele instancji, na pewno jest to lepsze rozwiązanie :)
JohnIdol 11

@JohnIdol Nice. Myślę, że zmienię flagę na „-waitForProcessToExit” lub coś w tym stylu, ale poza tym jest to bardziej eleganckie rozwiązanie. W tej chwili borykam się z problemem ClickOnce z odwołaniem się do jednego EXE z innego EXE, a to rozwiązałoby problem.
HiredMind

6

Metoda Start / Zakończ

// Get the parameters/arguments passed to program if any
string arguments = string.Empty;
string[] args = Environment.GetCommandLineArgs();
for (int i = 1; i < args.Length; i++) // args[0] is always exe path/filename
    arguments += args[i] + " ";

// Restart current application, with same arguments/parameters
Application.Exit();
System.Diagnostics.Process.Start(Application.ExecutablePath, arguments);

Wydaje się, że działa lepiej niż Application.Restart ();

Nie jestem pewien, jak sobie z tym radzi, jeśli program chroni przed wieloma wystąpieniami. Domyślam się, że lepiej byłoby uruchomić drugi plik .exe, który zatrzymuje się, a następnie uruchamia główną aplikację.


2
To może nie działać, jeśli aplikacja jest chroniona przed wieloma instancjami.
majkinetor

Tak, mam wrażenie, że wywołanie Application.Exit () powoduje tylko dodanie jakiejś wiadomości do kolejki gdzieś, która musi zostać przepompowana, więc drugi fragment kodu w mojej odpowiedzi prawdopodobnie nie zadziała.
Adam Nofsinger

Niestety ta technika nie działa (szkoda, że ​​tak nie jest! Jest o wiele prostsza niż moje rozwiązanie). Będzie działać wewnątrz debugera programu Visual Studio, ale nie w praktyce. Zobacz moją odpowiedź na niezdarne rozwiązanie, które działa poza debugerem.
HiredMind

HiredMind może mieć rację. Skończyło się na rozwiązaniu wzorca Watchdog.
Adam Nofsinger,

6

To proste, wystarczy wywołać Application.Restart()metody, które mają tendencję do wywoływania aplikacji w celu ponownego uruchomienia. Ale musisz wyjść ze środowiska lokalnego z ich kodami błędów:

Application.Restart();
Environment.exit(int errorcode);

możesz utworzyć wyliczenie kodu błędu, aby móc go efektywnie używać.
Inną metodą jest po prostu wyjście z aplikacji i rozpoczęcie procesu posiadającego ścieżkę do pliku wykonywalnego:

Application.exit();
System.Diagnostics.Process.Start(Application.ExecutablePath);

U mnie działało dobrze, w moim przypadku nie ma potrzeby aplikacji watchdog.
user685590

3

Wypróbuj ten kod:

bool appNotRestarted = true;

Ten kod musi również znajdować się w funkcji:

if (appNotRestarted == true) {
    appNotRestarted = false;
    Application.Restart();
    Application.ExitThread();
}

3

Wymyśliłem inne rozwiązanie, być może każdy też może z niego skorzystać.

string batchContent = "/c \"@ECHO OFF & timeout /t 6 > nul & start \"\" \"$[APPPATH]$\" & exit\"";
batchContent = batchContent.Replace("$[APPPATH]$", Application.ExecutablePath);
Process.Start("cmd", batchContent);
Application.Exit();

Kod jest uproszczony, więc zadbaj o wyjątki i takie tam;)


2

Zapominasz o opcjach / parametrach wiersza polecenia, które zostały przekazane do aktualnie działającej instancji. Jeśli ich nie przekażesz, nie wykonasz prawdziwego restartu. Ustaw parametry Process.StartInfoza pomocą klonu parametrów procesu, a następnie zacznij.

Na przykład, jeśli twój proces został uruchomiony jako myexe -f -nosplash myfile.txt, twoja metoda byłaby wykonywana tylko myexebez tych wszystkich flag i parametrów.


2

Chciałem, aby nowa aplikacja została uruchomiona po wyłączeniu starej.

Używanie process.WaitForExit () do czekania na zamknięcie własnego procesu nie ma sensu. To zawsze się skończy.

Tak więc moje podejście polega na użyciu Application.Exit (), a następnie czekania, ale zezwalam na przetwarzanie zdarzeń przez pewien czas. Następnie uruchom nową aplikację z tymi samymi argumentami, co poprzednia.

static void restartApp() {
    string commandLineArgs = getCommandLineArgs();
    string exePath = Application.ExecutablePath;
    try {
        Application.Exit();
        wait_allowingEvents( 1000 );
    } catch( ArgumentException ex ) {
        throw;
    }
    Process.Start( exePath, commandLineArgs );
}

static string getCommandLineArgs() {
    Queue<string> args = new Queue<string>( Environment.GetCommandLineArgs() );
    args.Dequeue(); // args[0] is always exe path/filename
    return string.Join( " ", args.ToArray() );
}

static void wait_allowingEvents( int durationMS ) {
    DateTime start = DateTime.Now;
    do {
        Application.DoEvents();
    } while( start.Subtract( DateTime.Now ).TotalMilliseconds > durationMS );
}

2

Możesz także użyć Restarter .

Restarter to aplikacja, która automatycznie monitoruje i ponownie uruchamia programy i aplikacje, które uległy awarii lub zawiesiły się. Pierwotnie został opracowany w celu monitorowania i ponownego uruchamiania serwerów gier, ale spełni swoje zadanie dla dowolnej konsoli lub programu lub aplikacji opartej na formularzu


1
Dostarczony link już nie działa, ale myślę, że jest to ta sama aplikacja na CNET: download.cnet.com/Restarter/3000-2094_4-75810552.html
Surfbutler

2
public static void appReloader()
    {
        //Start a new instance of the current program
        Process.Start(Application.ExecutablePath);

        //close the current application process
        Process.GetCurrentProcess().Kill();
    }

Application.ExecutablePath zwraca ścieżkę do pliku aplikacji .exe. Postępuj zgodnie z kolejnością wywołań. Możesz chcieć umieścić go w klauzuli try-catch.


1

Co powiesz na utworzenie pliku bat, uruchomienie pliku wsadowego przed zamknięciem, a następnie zamknięcie bieżącej instancji.

Plik wsadowy robi to:

  1. czekaj w pętli, aby sprawdzić, czy proces został zakończony.
  2. rozpocząć proces.

Jest to aplikacja watchdog dla biednych, którą opisuję nieco bardziej szczegółowo powyżej. Główną zaletą prawdziwej aplikacji nadzorującej jest to, że poradzi sobie nawet, jeśli oryginalna aplikacja umrze, nie będąc w stanie czegoś wyłączyć.
Adam Nofsinger,

@AdamNofsinger Teraz widzę. Brakowało mi tego komentarza. Możesz edytować swój post za pomocą tego rozwiązania, którego używasz.
AZ.

1

Oto moje 2 centy:

Sekwencja Uruchom nową instancję-> Zamknij bieżącą instancję powinna działać nawet dla aplikacji, które nie pozwalają na uruchamianie wielu kopii jednocześnie, ponieważ w tym przypadku do nowej instancji może zostać przekazany argument wiersza polecenia, który wskaże, że trwa ponowne uruchamianie więc sprawdzanie innych uruchomionych instancji nie będzie konieczne. Oczekiwanie na zakończenie pierwszej instancji również zostanie zaimplementowane, jeśli jest absolutnie konieczne, aby żadne dwie intencje nie działały równolegle.


1

Obawiam się, że ponowne uruchomienie całej aplikacji przy użyciu Process to niewłaściwe podejście do Twojego problemu.

Łatwiejszym sposobem jest zmodyfikowanie pliku Program.cs w celu ponownego uruchomienia:

    static bool restart = true; // A variable that is accessible from program
    static int restartCount = 0; // Count the number of restarts
    static int maxRestarts = 3;  // Maximum restarts before quitting the program

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        while (restart && restartCount < maxRestarts)
        {
           restart = false; // if you like.. the program can set it to true again
           restartCount++;  // mark another restart,
                            // if you want to limit the number of restarts
                            // this is useful if your program is crashing on 
                            // startup and cannot close normally as it will avoid
                            // a potential infinite loop

           try {
              Application.Run(new YourMainForm());
           }
           catch {  // Application has crashed
              restart = true;
           }
        }
    }

1
Warto wspomnieć, że dzięki takiemu rozwiązaniu można by było X razy ponownie uruchamiać aplikację, a następnie zamknąć aplikację, aby uniknąć nieskończonej pętli.
RooiWillie

Dzięki @RooiWillie Dodałem licznik, aby to zrobić na wypadek, gdyby program nie mógł normalnie wyjść.
Andrew

0

Miałem podobny problem, ale mój był związany z niemożliwym do zarządzania wyciekiem pamięci, którego nie mogłem znaleźć w aplikacji, która musi działać 24/7. Z klientem ustaliłem, że bezpieczny czas ponownego uruchomienia aplikacji to 03:00, jeśli zużycie pamięci przekroczy zdefiniowaną wartość.

Próbowałem Application.Restart, ale ponieważ wydaje się, że używa jakiegoś mechanizmu, który uruchamia nową instancję, gdy jest już uruchomiona, wybrałem inny schemat. Użyłem sztuczki, że system plików utrzymuje się, dopóki proces, który je utworzył, nie umrze. Tak więc z aplikacji upuściłem plik na dysk, ale nie Dispose()poradziłem sobie z tym. Użyłem tego pliku do wysłania `` siebie '' pliku wykonywalnego i katalogu startowego (aby zwiększyć elastyczność).

Kod:

_restartInProgress = true;
string dropFilename = Path.Combine(Application.StartupPath, "restart.dat");
StreamWriter sw = new StreamWriter(new FileStream(dropFilename, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite));
sw.WriteLine(Application.ExecutablePath);
sw.WriteLine(Application.StartupPath);
sw.Flush();
Process.Start(new ProcessStartInfo
{
    FileName = Path.Combine(Application.StartupPath, "VideoPhill.Restarter.exe"),
    WorkingDirectory = Application.StartupPath,
    Arguments = string.Format("\"{0}\"", dropFilename)
});
Close();

Close()na końcu zainicjowałoby zamknięcie aplikacji, a uchwyt pliku, którego użyłem StreamWritertutaj, byłby otwarty, dopóki proces naprawdę nie umarł. Następnie...

Do akcji wkracza Restarter.exe. PRÓBUJE odczytać plik w trybie wyłączności, uniemożliwiając mu uzyskanie dostępu do czasu śmierci głównej aplikacji, a następnie uruchamia główną aplikację, usuwa plik i istnieje. Myślę, że prościej nie może być:

static void Main(string[] args)
{
    string filename = args[0];
    DateTime start = DateTime.Now;
    bool done = false;
    while ((DateTime.Now - start).TotalSeconds < 30 && !done)
    {
        try
        {
            StreamReader sr = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite));
            string[] runData = new string[2];
            runData[0] = sr.ReadLine();
            runData[1] = sr.ReadLine();
            Thread.Sleep(1000);
            Process.Start(new ProcessStartInfo { FileName = runData[0], WorkingDirectory = runData[1] });
            sr.Dispose();
            File.Delete(filename);
            done = true;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Thread.Sleep(1000);
    }
}

0

Używam następujących i robi dokładnie to, czego szukasz:

ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
UpdateCheckInfo info = null;
info = ad.CheckForDetailedUpdate();
if (info.IsUpdateRequired)
{
    ad.UpdateAsync(); // I like the update dialog
    MessageBox.Show("Application was upgraded and will now restart.");
    Environment.Exit(0);
}

0

do używania Jako wylogowania musisz zamknąć wszystkie aplikacje z pamięci RAM, więc zamknij najpierw aplikację, a następnie uruchom ją ponownie

// po kliknięciu przycisku Wyloguj

foreach(Form frm in Application.OpenForms.Cast<Form>().ToList())
        {
            frm.Close();
        }
System.Diagnostics.Process.Start(Application.ExecutablePath);

0

Problem z użyciem Application.Restart () polega na tym, że uruchamia ona nowy proces, ale „stary” wciąż pozostaje. Dlatego zdecydowałem się zabić stary proces za pomocą następującego fragmentu kodu:

            if(Condition){
            Application.Restart();
            Process.GetCurrentProcess().Kill();
            }

I działa dobrze. W moim przypadku MATLAB i aplikacja C # współużytkują tę samą bazę danych SQLite. Jeśli MATLAB korzysta z bazy danych, aplikacja Form powinna ponownie uruchomić się (+ Countdown), aż MATLAB zresetuje swój bit zajętości w bazie danych. (Tylko dla dodatkowych informacji)


0

Możesz zawrzeć swój kod wewnątrz funkcji, a gdy potrzebny jest restart, możesz po prostu wywołać funkcję.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.