2011-01-23 14 views
59

मैं एक WPF एप्लिकेशन को पुनरारंभ कैसे कर सकता हूं? विंडोज़ रूपों में मैंमैं एक WPF एप्लिकेशन को पुनरारंभ कैसे करूं?

System.Windows.Forms.Application.Restart();

इस्तेमाल किया कैसे WPF में यह करने के लिए?

+3

संभावित डुप्लिकेट: http://stackoverflow.com/questions/3895188/restart-my-application-using-c, http://stackoverflow.com/questions/1225406/if-wpf-app-is -नॉट-प्रतिसाद-फिर-ऑटो-पुनरारंभ, http://stackoverflow.com/questions/3634439/how-can-i-restart-wpf- एप्लिकेशन। आम सहमति यह है कि WinForms के तरीके का कोई सटीक डुप्लिकेट नहीं है, और सभी "समाधान" थोड़ा हैकी गंध करते हैं। मुझे संदेह है कि ऐसा इसलिए है क्योंकि डिबगिंग के दौरान आपको आमतौर पर ऐसा करने की ज़रूरत नहीं है। –

+0

@ कोडी ग्रे अब मैं उन तरीकों को फिर से कॉल कर रहा हूं जिन्हें एप्लिकेशन के स्टार पर बुलाया जा रहा है। यह अच्छा काम करता है। लेकिन अन्य एप्लिकेशन के लिए मुझे एप्लिकेशन को पुनरारंभ करना होगा। – Hooch

+2

@ कोडी ग्रे आप क्यों कहते हैं कि किसी को इसकी आवश्यकता नहीं होनी चाहिए? ऐसे कई कारण हैं जिनसे किसी एप्लिकेशन को पुनरारंभ करने की आवश्यकता हो सकती है, उपयोगकर्ता को निष्पादन योग्य फिर से चलाने के लिए मजबूर क्यों करें जब आप उनके लिए ऐसा कर सकें? – epalm

उत्तर

73

मुझे यह मिला: यह काम करता है। लेकिन। क्या कोई बेहतर तरीका है?

System.Diagnostics.Process.Start(Application.ResourceAssembly.Location); 
Application.Current.Shutdown(); 
+1

क्या यह कमांड लाइन तर्कों को संरक्षित करता है !? –

+1

@AndreiRinea No. लेकिन बस उन्हें शुरुआत में सहेजें और उन्हें इस फ़ंक्शन कॉल के लिए तर्क के रूप में पास करें। यह आसान है। – Hooch

+12

ध्यान दें कि यदि आप एप्लिकेशन को क्लिकऑन के साथ तैनात किया गया है तो आप इस विधि का उपयोग नहीं करना चाहते हैं। जब आप पुनरारंभ करते हैं तो 'ApplicationDeployment.IsNetworkDeployed' गलत होगा। अधिक जानकारी के लिए http://bit.ly/RKoVBz देखें। यदि आपका एप्लिकेशन ClickOnce के साथ तैनात नहीं है, तो यह विधि बहुत अच्छी तरह से काम करती है। – blachniet

32

मैं WPF में इस का उपयोग किया है, सफलतापूर्वक:

System.Windows.Forms.Application.Restart(); 
System.Windows.Application.Current.Shutdown(); 
+5

मुझे लगता है कि इसके लिए WinForms असेंबली संदर्भ शामिल करने के लिए यह थोड़ा अधिक है। –

+9

@commanderz मैं सहमत होने के इच्छुक हूं, हालांकि मैं पहले से ही एक ही प्रोजेक्ट में 'System.Windows.Forms.FolderBrowserDialog()' जैसे WinForms जादू का उपयोग कर रहा हूं। – epalm

+2

@ MatějZábský ClickOnce का उपयोग करते समय भी आवश्यक है। – John

2

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

यह दो अनुप्रयोग उदाहरणों को एक ही समय में खोलने से रोकता है। मेरे मामले में यह दो आवेदन उदाहरणों के लिए एक ही समय में खुला है - मैं यह सुनिश्चित करने के लिए एक म्यूटेक्स का उपयोग कर रहा हूं कि केवल एक ही एप्लीकेशन खुला है - कुछ हार्डवेयर संसाधनों का उपयोग कर एप्लिकेशन के कारण।

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

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

// Close the current application 
Application.Current.MainWindow.Close(); 
+12

नींद के साथ बैच फ़ाइल लिखना सिर्फ एक लंबे हैक की तरह लगता है लेकिन संभवतः बदतर है। – Philliproso

+0

@ फिलिप्रोसो सहमत हुए, यह एक हैक है, उस समय मुझे पुनरारंभ किए गए एप्लिकेशन के लिए पूरी तरह से नई विंडोज़ प्रक्रिया की आवश्यकता थी, जिस पर मैं यहां अन्य तरीकों का विश्वास नहीं करता हूं, लेकिन यह करता है। –

9
Application.Restart(); 

या

System.Diagnostics.Process.Start(Application.ExecutablePath); 
Application.Exit(); 
:

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

और WPF आवेदन में, इस कोड को जोड़ना

मेरे कार्यक्रम में मेरे पास केवल एक इंस्टान सुनिश्चित करने के लिए एक म्यूटेक्स है कंप्यूटर पर चल रहे एप्लिकेशन की सीई। यह नए प्रारंभिक एप्लिकेशन को शुरू नहीं कर रहा था क्योंकि म्यूटेक्स को समय-समय पर रिलीज़ नहीं किया गया था। नतीजतन मैंने गुणों में एक मूल्य डाल दिया। सेटिंग्स जो इंगित करती हैं कि एप्लिकेशन पुनरारंभ हो रहा है। एप्लिकेशन को कॉल करने से पहले। रीस्टार्ट() गुण। सेटिंग्स मूल्य सत्य पर सेट है। प्रोग्राम में। मेन() मैंने उस विशिष्ट प्रॉपर्टी के लिए एक चेक भी जोड़ा। सेटिंग्स मूल्य ताकि जब सत्य हो तो यह गलत पर रीसेट हो जाता है और वहां एक थ्रेड होता है। नींद (3000);

if (ShouldRestartApp) 
{ 
    Properties.Settings.Default.IsRestarting = true; 
    Properties.Settings.Default.Save(); 
    Application.Restart(); 
} 

Program.Main में()

[STAThread] 
static void Main() 
{ 
    Mutex runOnce = null; 

    if (Properties.Settings.Default.IsRestarting) 
    { 
     Properties.Settings.Default.IsRestarting = false; 
     Properties.Settings.Default.Save(); 
     Thread.Sleep(3000); 
    } 

    try 
    { 
     runOnce = new Mutex(true, "SOME_MUTEX_NAME"); 

     if (runOnce.WaitOne(TimeSpan.Zero)) 
     { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
     } 
    } 
    finally 
    { 
     if (null != runOnce) 
     runOnce.Close(); 
    } 
} 

यह है कि:

अपने कार्यक्रम में आप तर्क हो सकता है। मुझे

+15

यह उत्तर (उत्तर के रूप में चिह्नित) भ्रामक है। मूल प्रश्न एक डब्ल्यूपीएफ एप्लिकेशन को पुनरारंभ करने के बारे में था जैसे कि WinForms में यह कैसे किया गया था।दुर्भाग्यवश आपका उत्तर अभी भी WinForms पुनरारंभ (कुछ ऐसा जो WPF में उपलब्ध नहीं है) का उपयोग कर रहा है और इसमें ऐसे उदाहरण भी शामिल हैं जो पूछे जाने वाले प्रश्न (जैसे म्यूटेक्स?) के लिए अप्रासंगिक हैं। – Crypton

+2

शायद WPF- केवल उत्तर के लिए भ्रामक है लेकिन मेरे लिए अन्य उत्तरों के साथ संयोजन में उपयोगी है क्योंकि मुझे अपने डब्ल्यूपीएफ को पुनरारंभ करने की आवश्यकता थी जो म्यूटेक्स का उपयोग करता है। यह नौकरी करता है। – sgissinger

0
Application.Restart(); 
Process.GetCurrentProcess().Kill(); 

काम एक आकर्षण की तरह मेरे लिए काम किया, दूसरी तरह के आसपास बस एप्लिकेशन का एक और उदाहरण शुरू कर दिया।

+1

इससे मुझे एक साधारण समस्या से बचने में मदद मिली, मेरे स्टार्टअप तर्क, मेरा ऐप किसी भी पुनरारंभ विधि पर क्रैश हो गया, जबकि मैंने इसे चीजों को सुरक्षित रखा। धन्यवाद :) – OmarBizreh

+1

आप कहां से पुनरारंभ करते हैं? System.Windows.Aplication में रीस्टार्ट विधि नहीं है – usefulBee

6
Application.Current.Shutdown(); 
System.Windows.Forms.Application.Restart(); 

इस आदेश में के लिए

+5

लेकिन यह डब्ल्यूएफ है और डब्ल्यूपीएफ नहीं है .... –

+1

मैं आपको बिल्कुल नहीं बता सकता कि यह क्यों काम करता है लेकिन केवल यह है कि यह WPF – Jraco11

+0

में WinForms में मेरे लिए सही काम करता है! –

3

1 सेकंड देरी के बाद कमांड लाइन द्वारा प्रोग्राम का एक नया उदाहरण चलाता है। देरी के दौरान वर्तमान उदाहरण शट डाउन।

ProcessStartInfo Info = new ProcessStartInfo(); 
Info.Arguments = "/C choice /C Y /N /D Y /T 1 & START \"\" \"" + Assembly.GetExecutingAssembly().Location + "\""; 
Info.WindowStyle = ProcessWindowStyle.Hidden; 
Info.CreateNoWindow = true; 
Info.FileName = "cmd.exe"; 
Process.Start(Info); 
Application.Current.Shutdown(); 
+0

यह बहुत अच्छा काम करता है, धन्यवाद। – psulek

संबंधित मुद्दे