2012-03-07 15 views
12

मैं अपने एप्लिकेशन को पुनरारंभ करने के लिए फ़ंक्शन के साथ बनाना चाहता हूं। मैंअपने आप से एक एप्लिकेशन को पुनरारंभ करें

ProcessStartInfo Info=new ProcessStartInfo(); 
Info.Arguments="/C choice /C Y /N /D Y /T 3 & Del "+ 
       Application.ExecutablePath; 
Info.WindowStyle=ProcessWindowStyle.Hidden; 
Info.CreateNoWindow=true; 
Info.FileName="cmd.exe"; 
Process.Start(Info); 
Application.Exit(); 

यह इस तरह फिर से सब पर ... और दूसरी समस्या है, यह कैसे शुरू करने के लिए काम नहीं करता है codeproject पर पाया? शायद एप्लिकेशन शुरू करने के लिए तर्क भी हैं।

संपादित करें:

http://www.codeproject.com/script/Articles/ArticleVersion.aspx?aid=31454&av=58703 
+0

क्या होता है, कोई अपवाद या कुछ भी नहीं? –

+3

"यह बिल्कुल काम नहीं करता है" एक समस्या का एक खराब विवरण है। क्या काम नहीं कर रहा है त्रुटियाँ? अपवाद? कुछ और? – Oded

+0

क्या आप वाकई सही तर्क हैं? ऐसा लगता है कि यह आपके आवेदन को आजमाने और हटाने जा रहा है! आम तौर पर आपको कुछ अन्य प्रक्रियाओं को आपके लिए पुनरारंभ करना होगा - जो वे cmd के साथ यहां करने की कोशिश कर रहे हैं - हालांकि हो सकता है कि माता-पिता की प्रक्रिया केवल CreateProcess स्वयं ही हो, या किसी भी तरह से प्रक्रिया में एक नया ऐपडोमेन बनाएं और पुराने को नष्ट कर दें एक? – Rup

उत्तर

36

मैं आपके द्वारा ऐप्स को पुनरारंभ करते समय किए गए कोड के समान कोड का उपयोग करता हूं। मैं इस तरह मेरे लिए एप्लिकेशन को पुनः प्रारंभ करने के लिए एक समय समाप्त हो गया cmd आदेश भेजें:

ProcessStartInfo Info = new ProcessStartInfo(); 
Info.Arguments = "/C ping 127.0.0.1 -n 2 && \"" + Application.ExecutablePath + "\""; 
Info.WindowStyle = ProcessWindowStyle.Hidden; 
Info.CreateNoWindow = true; 
Info.FileName = "cmd.exe"; 
Process.Start(Info); 
Application.Exit(); 

आदेश ओएस को भेजा जाता है, पिंग 2-3 सेकंड के लिए स्क्रिप्ट, इस समय तक आवेदन Application.Exit() से बाहर निकल गया है रुक जाता है , तो पिंग के बाद अगला आदेश फिर से शुरू होता है।

नोट: \" पथ के चारों ओर उद्धरण डालता है, इसमें रिक्त स्थान होते हैं, जो cmd उद्धरण के बिना संसाधित नहीं कर सकता है।

आशा है कि इससे मदद मिलती है!

+0

यह समाधान बहुत बढ़िया है, लेकिन पिंग कमांड का उपयोग देरी के रूप में करते हुए यह थोड़ा गंदा महसूस करता है - दुर्भाग्यवश ऐसा नहीं लगता है कि ऐसा करने का कोई अन्य तरीका है - मैंने (बैच) 'नींद' कमांड की कोशिश की और यह काम नहीं करता है। –

+0

धन्यवाद। हाँ यह थोड़ा हैकी है, लेकिन इसका मतलब है कि आप कुछ भी अलग से इंस्टॉल किए बिना ऐप को विश्वसनीय रूप से पुनरारंभ कर सकते हैं। मुझे लगता है कि बैच 'नींद 'कमांड एक अतिरिक्त है जिसे आपको मैन्युअल रूप से इंस्टॉल करना है। –

+1

दो दूसरे विराम मेरे लिए काम नहीं करते हैं। यह सिर्फ निर्दिष्ट आवेदन तुरंत लॉन्च करता है। मेरे मामले में, मैं एक अद्यतनकर्ता एप्लिकेशन का उपयोग कर रहा हूं जो तब विफल रहता है क्योंकि चल रहे एप्लिकेशन ने अभी तक इसकी फ़ाइलों को रिलीज़ नहीं किया है। मैं विंडोज 10 पर .NET 4.5.1 का उपयोग कर रहा हूं। – kraeg

9

क्यों बस का पालन नहीं कर?

Process.Start(Application.ExecutablePath); 
Application.Exit(); 

क्या आप वाकई एप्लिकेशन दो बार नहीं चलता है तो Environment.Exit(-1) (नहीं वास्तव में अच्छा तरीका है) या एक दूसरे एप्लिकेशन है, जो मुख्य करने की प्रक्रिया शुरू करने के लिए जाँच करता तरह कुछ है जो इस प्रक्रिया को तुरंत मारता है का उपयोग होना चाहते हैं ऐप और जैसे ही प्रक्रिया समाप्त हो जाती है, इसे फिर से शुरू होता है।

+0

मैं भूल गया, मैं नहीं चाहता कि यह ऐप एक ही समय में दो बार खोला जाए। – Noli

+1

@ नोली दूसरी पंक्ति इसका ख्याल रखती है। – Stijn

+0

फिर कोशिश करें कि ""/सी विकल्प/सीवाई/एन/डीवाई/टी 3 और "+ एप्लीकेशन। एक्सटेक्टेबलपैथ;" क्योंकि "डेल" आपके एप्लिकेशन को हटा देगा, लेकिन यह अभी भी हो सकता है, अगर बंद होने पर ऐप दो बार चलता है लंबे समय से 3 एस ... – ChrFin

24

का प्रयोग क्यों न

Application.Restart(); 

??

अधिक पर Restart

+0

उस विधि को नहीं पता था और मुझे लगता है कि यह जाने का सबसे अच्छा तरीका है ... – ChrFin

+0

कृपया, मुझे एक और तरीका चाहिए ... – Noli

+0

@ नोली: क्यों? यह वही करता है जो आपने पूछा: 'एप्लिकेशन को बंद कर देता है और तुरंत एक नया उदाहरण शुरू करता है।' – ChrFin

3

Winforms Application.Restart() विधि है, जो सिर्फ इतना है कि करता है। यदि आप WPF का उपयोग कर रहे हैं, तो आप बस System.Windows.Forms पर एक संदर्भ जोड़ सकते हैं और इसे कॉल कर सकते हैं।

+0

एप्लिकेशन में काम करता है। रीस्टार्ट काम नहीं करता है। यह शायद ही कभी फ़ंक्शन को कॉल करने वाले एप्लिकेशन को बंद कर देता है। यह बहुत अविश्वसनीय – JeremyK

+0

है, यह अब तक मेरे लिए एक डब्ल्यूपीएफ आवेदन में ठीक काम करता है। –

+0

एक WPF ऐप – Sandepku

6

आपके पास प्रारंभिक एप्लिकेशन ए है, आप पुनरारंभ करना चाहते हैं। तो, आप एक को मारने के लिए चाहते हैं, तो एक छोटे से आवेदन बी शुरू कर दिया है, बी मार एक है, तो बी ए प्रारंभ करें, और बी

को मारने के लिए एक प्रक्रिया शुरू करने के लिए:

Process.Start("A.exe"); 

एक प्रक्रिया को मारने के लिए , इस तरह

Process[] procs = Process.GetProcessesByName("B"); 

foreach (Process proc in procs) 
    proc.Kill(); 
+0

हाँ के लिए काम नहीं कर रहा है हाँ! Thats क्यों मैं उपरोक्त comand, ऐप का इस्तेमाल किया। बी "सीएमडी" है। मैं इसे फिर से शुरू करना चाहता हूं, यह ठीक है कि यह हटा दिया जाएगा। बस मुझे बताएं कि कैसे: डी – Noli

+0

बेहतर उपयोग [Process.ID] (https://msdn.microsoft.com/en-us/library/system.diagnostics.process.id%28v=vs.110%29.aspx) और [Process.GetProcessById] (https://msdn.microsoft.com/en-us/library/76fkb36k%28v=vs.110%29.aspx) – Brettetete

+0

मुझे यह बहुत पसंद है। मैं प्रोग्राम बी "टर्मिनेटर" कहूंगा। अच्छी बात यह है कि टर्मिनेटर एएक्सई को अंतिम रूप देने के लिए इंतजार कर सकता है, हालांकि इसे – henon

2

बहुत से लोग एप्लिकेशन का उपयोग करने का सुझाव दे रहे हैं। रीस्टार्ट। हकीकत में, यह समारोह शायद ही कभी अपेक्षित प्रदर्शन करता है। मैंने इसे उस एप्लिकेशन को बंद नहीं किया है जिसे मैं इसे कॉल कर रहा हूं। मुझे मुख्य रूप से बंद करने जैसे अन्य तरीकों के माध्यम से एप्लिकेशन को बंद करना पड़ा है।

आपके पास इसे संभालने के दो तरीके हैं। आप या तो एक बाहरी प्रोग्राम है जो फोन करने की प्रक्रिया बंद कर देता है और एक नया शुरू होता है,

या,

आप अपने नए सॉफ्टवेयर की शुरुआत है एक ही एप्लिकेशन के अन्य उदाहरण मारने यदि एक बहस को पुनः आरंभ करने के रूप में पारित किया गया है।

 private void Application_Startup(object sender, StartupEventArgs e) 
     { 
      try 
      { 
       if (e.Args.Length > 0) 
       { 
        foreach (string arg in e.Args) 
        { 
         if (arg == "-restart") 
         { 
          // WaitForConnection.exe 
          foreach (Process p in Process.GetProcesses()) 
          { 
           // In case we get Access Denied 
           try 
           { 
            if (p.MainModule.FileName.ToLower().EndsWith("yourapp.exe")) 
            { 
             p.Kill(); 
             p.WaitForExit(); 
             break; 
            } 
           } 
           catch 
           { } 
          } 
         } 
        } 
       } 
      } 
      catch 
      { 
      } 
     } 
+0

की आवश्यकता है जो खाली 'पकड़' ब्लॉक के साथ अपवादों को अनदेखा करता है ... Ewww .... – jeuxjeux20

+0

डीबग स्टेटमेंट व्यक्तिपरक हैं। जो भी कोड का उपयोग करता है वह इसे कैसे संभाल सकता है इसे संभाल सकता है। – JeremyK

1

ऐसा करने का एक और तरीका जो इन समाधानों से थोड़ा क्लीनर महसूस करता है वह बैच फ़ाइल चलाने के लिए है जिसमें वर्तमान एप्लिकेशन को समाप्त करने के लिए प्रतीक्षा करने के लिए एक विशिष्ट देरी शामिल है। इसमें दो आवेदन उदाहरणों को एक ही समय में खोलने से रोकने का अतिरिक्त लाभ है।

उदाहरण विंडोज़ बैच फ़ाइल ("restart.bat"):

sleep 5 
start "" "C:\Dev\MyApplication.exe" 

आवेदन में, इस कोड जोड़ें:

// Launch the restart batch file 
Process.Start(@"C:\Dev\restart.bat"); 

// Close the current application (for WPF case) 
Application.Current.MainWindow.Close(); 

// Close the current application (for WinForms case) 
Application.Exit(); 
1

मेरे समाधान:

 private static bool _exiting; 
    private static readonly object SynchObj = new object(); 

     public static void ApplicationRestart(params string[] commandLine) 
    { 
     lock (SynchObj) 
     { 
      if (Assembly.GetEntryAssembly() == null) 
      { 
       throw new NotSupportedException("RestartNotSupported"); 
      } 

      if (_exiting) 
      { 
       return; 
      } 

      _exiting = true; 

      if (Environment.OSVersion.Version.Major < 6) 
      { 
       return; 
      } 

      bool cancelExit = true; 

      try 
      { 
       List<Form> openForms = Application.OpenForms.OfType<Form>().ToList(); 

       for (int i = openForms.Count - 1; i >= 0; i--) 
       { 
        Form f = openForms[i]; 

        if (f.InvokeRequired) 
        { 
         f.Invoke(new MethodInvoker(() => 
         { 
          f.FormClosing += (sender, args) => cancelExit = args.Cancel; 
          f.Close(); 
         })); 
        } 
        else 
        { 
         f.FormClosing += (sender, args) => cancelExit = args.Cancel; 
         f.Close(); 
        } 

        if (cancelExit) break; 
       } 

       if (cancelExit) return; 

       Process.Start(new ProcessStartInfo 
       { 
        UseShellExecute = true, 
        WorkingDirectory = Environment.CurrentDirectory, 
        FileName = Application.ExecutablePath, 
        Arguments = commandLine.Length > 0 ? string.Join(" ", commandLine) : string.Empty 
       }); 

       Application.Exit(); 
      } 
      finally 
      { 
       _exiting = false; 
      } 
     } 
    } 
+0

आप अभी भी दो इंस्टेंस चल रहे हैं। – Noli

+0

इसे फिक्स्ड। लॉक() और MethodInvoker यदि आप बाहरी धागे द्वारा इसका उपयोग करते हैं! –

0

लिए। नेट एप्लिकेशन समाधान इस तरह दिखता है:

System.Web.HttpRuntime.UnloadAppDomain() 

मैंने myconfig फ़ाइल में AppSettings को बदलने के बाद अपने वेब एप्लिकेशन को पुनरारंभ करने के लिए इसका उपयोग किया।

System.Configuration.Configuration configuration = WebConfigurationManager.OpenWebConfiguration("~"); 
configuration.AppSettings.Settings["SiteMode"].Value = model.SiteMode.ToString(); 
configuration.Save(); 
संबंधित मुद्दे