मैं अपने C # WinForm एप्लिकेशन को कैसे पुनः आरंभ करूं?


86

C # .NET 2.0 WinForm एप्लीकेशन विकसित करना। एप्लिकेशन को बंद करने और खुद को पुनरारंभ करने की आवश्यकता है।

Application.Restart();

उपरोक्त विधि अविश्वसनीय साबित हुई है ।

एप्लिकेशन को पुनरारंभ करने का एक बेहतर तरीका क्या है?


3
मैं आपके ऐप को पुनः आरंभ करने की आवश्यकता के बारे में उत्सुक हूं। मैंने पहले कभी नहीं सोचा कि आपकी परिस्थितियाँ क्या हैं?
— जेएफएच

हमारी विशेष परिस्थिति - एक मीडिया प्लेयर अनुप्रयोग जो कुछ छवियों और फ्लैश सामग्री को लूप में चलाने के लिए माना जाता है। मशीन के पुनरारंभ के बिना दिनों और दिनों के लिए चलना चाहिए, और कोई कीबोर्ड / माउस नहीं है इसलिए कोई उपयोगकर्ता सहभागिता नहीं है। यदि प्रोग्राम क्रैश हो जाता है (बिना अपवाद के), तो प्रोग्राम को पुनरारंभ करने की आवश्यकता है, न कि बाहर निकलने या किसी त्रुटि को प्रदर्शित करने की। stackoverflow.com/questions/773768/… यह देखें कि क्यों कार्यक्रम में अपवाद हैं जिनके कारण मैं रोक नहीं सकता। :(
— एडम नोफ़्सिंगर

1
अंत में, हमारे आवेदन के लिए एक बेहतर समाधान एक छोटे वॉचडॉग एप्लिकेशन को विकसित करना था जो मुख्य एप्लिकेशन से शुरू होता है (यदि पहले से नहीं चल रहा है)। वॉचडॉग बस हर 10 सेकंड की जांच करता है या नहीं यह देखने के लिए कि क्या मुख्य एप्लिकेशन में अभी भी एक प्रक्रिया चल रही है, और यदि ऐसा नहीं है, तो यह एक शुरू होता है। मुख्य ऐप से पुनरारंभ करने की कोशिश करने की तुलना में सरल, सुरुचिपूर्ण और बहुत अधिक मजबूत।
— एडम नोफ़िंगर

2
पुनरारंभ करने का दूसरा कारण है जब आप भाषा बदलते हैं या अपडेट डाउनलोड करते हैं।
— एंड्रयू ट्रोपल

1
लेकिन क्या होगा ... प्रहरी आवेदन दुर्घटनाओं?
— मेटोनीम

जवाबों:


39

दुर्भाग्य से आप वर्तमान में चल रही प्रक्रिया का एक उदाहरण शुरू करने के लिए Process.Start () का उपयोग नहीं कर सकते हैं। Process.Start () डॉक्स के अनुसार: "यदि प्रक्रिया पहले से ही चल रही है, तो कोई अतिरिक्त प्रक्रिया संसाधन प्रारंभ नहीं है ..."

यह तकनीक वीएस डिबगर के तहत ठीक काम करेगी (क्योंकि वीएस कुछ प्रकार का जादू करता है जो प्रोसेस का कारण बनता है। यह सोचने के लिए कि प्रक्रिया पहले से ही नहीं चल रही है), लेकिन डिबगर के नीचे नहीं चलने पर विफल हो जाएगी। (ध्यान दें कि यह ओएस-विशिष्ट हो सकता है - मुझे याद है कि मेरे कुछ परीक्षण में, इसने XP या विस्टा पर काम किया था, लेकिन मैं इसे डिबगर के तहत चलाने के लिए याद रख सकता हूं।)

यह तकनीक ठीक उसी तरह है जिसका उपयोग पिछले प्रोग्रामर द्वारा उस परियोजना पर किया गया है जिस पर मैं वर्तमान में काम कर रहा हूं, और मैं काफी समय से इसके लिए वर्कअराउंड खोजने की कोशिश कर रहा हूं। अब तक, मैंने केवल एक समाधान पाया है, और यह सिर्फ मुझे गंदा और कर्कश लगता है: एक 2 एप्लिकेशन शुरू करें, जो पहले आवेदन को समाप्त करने के लिए पृष्ठभूमि में इंतजार करता है, फिर 1 आवेदन को फिर से लॉन्च करता है। मुझे यकीन है कि यह काम करेगा, लेकिन, हाँ।

संपादित करें: एक 2 आवेदन कार्यों का उपयोग करना। मैंने दूसरे ऐप में किया था:

    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, "");
    }

(यह एक बहुत ही सरल उदाहरण है। वास्तविक कोड में बहुत सारी जाँच की गई है, त्रुटि से निपटने, आदि)


मैं HiredMind से सहमत हूं, और मैं वास्तव में उसी "वॉचडॉग कार्यक्रम" के साथ गया था जो उत्तर लिखने के तुरंत बाद खुद को लागू करता है। क्षमा करें, यहाँ वापस आना चाहिए और अद्यतन किया जाना चाहिए। मुझे नहीं लगता कि यह बहुत बदसूरत / yucky / गंदा महसूस करना चाहिए । प्रहरी कार्यक्रम पैटर्न बहुत व्यापक रूप से उपयोग किया जाता है।
— एडम नोफ़िंगर

आपको वास्तव में डिस्क पर एक दूसरे एप्लिकेशन की आवश्यकता नहीं है ... आप एक स्क्रिप्ट का उपयोग कर सकते हैं और इसे अस्थायी नाम के साथ फ्लाई पर उत्पन्न कर सकते हैं ... मुझे लगता है कि यह दोषी के आपके विचार को फिर से शुरू करने के लिए दूसरा आवेदन हो सकता है आपका अपना ... या आप एक संपूर्ण C # एप्लिकेशन को "उत्सर्जित" कर सकते हैं, इसे संकलित कर सकते हैं, इसे डिस्क पर सहेज सकते हैं और इसे निष्पादित कर सकते हैं (गंदी, गंदी सोच) ..
— Loudenvier

पहला पैराग्राफ सही नहीं है: Process.Startओएस प्रक्रियाओं को चलाने की सूची को नहीं देखता है। यह दस्तावेजी बयान केवल कक्षा के उस ऑब्जेक्ट उदाहरण के बारे में बात करता है Process। Processवर्ग एक चलने वाली प्रक्रिया के साथ संलग्न किया जा सकता है लेकिन यह भी एक प्रारंभ नहीं किया गया राज्य में हो सकता है। मेरी राय में यह एक डिज़ाइन पेंच है। सबसे अच्छा अभ्यास, आईएमओ, एक Process उदाहरण का पुन: उपयोग नहीं करना है और निर्माण के तुरंत बाद इसे शुरू करना है। आदर्श रूप में, स्थैतिक Process.Startविधि का उपयोग करें । फिर, यह प्रलेखन और डिज़ाइन दोष कभी भी खेल में नहीं आते हैं।
— usr

यहाँ दिखाया गया कोड भी अविश्वसनीय होने के कारण है WaitForExit(1000)। लेकिन नई प्रक्रिया शुरू करने के लिए पूरी प्रतीक्षा आवश्यक नहीं है। यह अतिरिक्त व्यवहार हो सकता है जिसे आप चाहते हैं, लेकिन एक नई प्रक्रिया शुरू करने की आवश्यकता नहीं है।
— usr

मैं अब के बारे में नहीं जानता, लेकिन नौ साल पहले (अहम) यह निश्चित रूप से सही था। :-)
— हेरेडमाइंड

71

मेरे लिए काम करने वाला बहुत सरल तरीका है:

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

यह कमांड-लाइन तर्कों को संरक्षित करता है और घटना संचालकों के बावजूद काम करता है जो सामान्य रूप से एप्लिकेशन को बंद होने से रोकते हैं।

रिस्टार्ट () कॉल से बाहर निकलने की कोशिश करता है, वैसे भी एक नया उदाहरण शुरू करता है और वापस लौटता है। एक्ज़िट () कॉल फिर किसी भी घटना संचालकों को चलाने का मौका दिए बिना प्रक्रिया को समाप्त कर देता है। एक बहुत ही संक्षिप्त अवधि है जिसमें दोनों प्रक्रियाएं चल रही हैं, जो मेरे मामले में समस्या नहीं है, लेकिन शायद अन्य मामलों में।

निकास कोड 0 Environment.Exit(0);एक साफ शटडाउन निर्दिष्ट करता है। आप एक त्रुटि उत्पन्न करने के लिए 1 से भी बाहर निकल सकते हैं।


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

System.Windows.Forms.Application.Restart () WPF अनुप्रयोगों के लिए भी काम करता है। विंडोज 10 ओएस के साथ परीक्षण किया गया।
— NthDeveloper

Whaaaat ?! आप किडिन ... सही? सी # <3। ध्यान रखें, यह डिफ़ॉल्ट रूप से OnClose()फॉर्म ईवेंट और समान नहीं बढ़ाएगा ।
— F8ER

56

यदि आप मुख्य एप्लिकेशन फॉर्म में हैं तो उपयोग करने का प्रयास करें

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

7
यह समान है, लेकिन अलग है। Application.Exit ने मेरे लिए काम नहीं किया, और इसने () काम किया।
— दार्कर

1
मई Enviorment.Exit(0)भी काम करेगा।
— द्विज

2
Enviorment.Exitयह एक गंदा और काफी आक्रामक निकास है क्योंकि यह एप्लिकेशन क्लीनअप कोड को चलने से रोकता है। ज्यादातर समय सही विकल्प नहीं।
— usr

16

मुझे पार्टी में देर हो सकती है लेकिन यहाँ मेरा सरल समाधान है और यह मेरे पास हर एप्लिकेशन के साथ एक आकर्षण की तरह काम करता है:

        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
        { }

Win-7-x64 और Win-XP-x32 पर बहुत अच्छी तरह से काम करता है। मैं डॉक्स में किसी भी बाधा के बारे में कुछ नहीं देखता हूं । यह स्वीकृत उत्तर होना चाहिए।
— बिटरब्ले जुए

@Bitterblue आपके द्वारा पोस्ट किए गए डॉक्स के लिए लिंक "यदि प्रक्रिया पहले से ही चल रही है, तो कोई अतिरिक्त प्रक्रिया संसाधन शुरू नहीं किया गया है।" यह टिप्पणी अनुभाग में तीसरी पंक्ति है। काश यह इस तरह नहीं था, लेकिन यह है।
— HiredMind

@HiredMind मुझे लगता है कि हम इस बारे में बहस कर सकते हैं कि हम में से प्रत्येक के लिए "बाधाएं" क्या हैं। लेकिन अनुभाग का शीर्षक "रिमार्क्स" है न कि "अड़चनें"। इसलिए मैं इसके साथ रह सकता हूं। और आप क्यों चाहते हैं कि यह इस तरह से नहीं था? क्या आपने इसके साथ कोई समस्या अनुभव की? क्योंकि मैं नहीं था। मेरे लिए निर्दोष रूप से काम करता है।
— Bitterblue

@HiredMind यह कुछ भी व्यक्तिगत या कुछ भी नहीं है, लेकिन मेरे सी # ऐप को पुनः आरंभ करने के लिए एक दूसरे ऐप या स्क्रिप्ट का उपयोग करने का विचार मेरे लिए विकर्षक है। Win7 अब तक रिलीज़ मोड में इस विधि को त्रुटिपूर्ण रूप से निष्पादित करता है (मैं इसका उपयोग अपने ऐप को पुनरारंभ करने के लिए करता हूं जब उपयोगकर्ता भाषा बदलता है = महत्वपूर्ण कुछ भी नहीं)। इसलिए मैं उपयोगकर्ता को स्वयं को अनुमोदित नहीं करने के तरीकों की तुलना में मैन्युअल रूप से ऐप को पुनरारंभ करने के लिए कहूंगा। मैंने अतीत में स्क्रिप्ट का उपयोग किया है और मुझे यह पूरी तरह से पसंद नहीं आया।
— Bitterblue

@BitterBlue मैं सहमत हूं कि एक दूसरे ऐप का उपयोग करने से बेकार है - मैंने अपने जवाब में ऐसा कहा। लेकिन क्या आपने डिबगर के बाहर एकल-ऐप विधि की कोशिश की है? इस उत्तर को छोड़ देने पर यह विंडोज के कुछ संस्करणों पर काम नहीं करता था, और रिलीज़ या डीबग मोड का इससे कोई लेना-देना नहीं था। अगर यह तुम्हारे लिए काम करता है, महान! लेकिन मुझे इस समस्या का सामना करना पड़ा और मुझे जो मिला उससे सैकड़ों नाराज उपयोगकर्ता थे।
— HiredMind

12

मेरे पास एक ही सटीक समस्या थी और मुझे भी डुप्लिकेट इंस्टेंसेस को रोकने के लिए एक आवश्यकता थी - मैं प्रस्ताव देता हूं कि HiredMind एक वैकल्पिक समाधान प्रस्तावित कर रहा है (जो ठीक काम करेगा)।

मैं जो कर रहा हूं वह नई प्रक्रिया शुरू कर रहा है पुरानी प्रक्रिया की प्रक्रिया के साथ (जो कि पुनरारंभ होता है) एक 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);

फिर जब नया ऐप शुरू होता है, तो मैं सबसे पहले सेमी लाइन आर्ग्स को पार्स करता हूं और जांचता हूं कि क्या रिस्टार्ट फ्लैग एक प्रोसेसआईड के साथ है, तो उस प्रक्रिया से बाहर निकलने का इंतजार करें:

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
   }
}

मैं स्पष्ट रूप से उन सभी सुरक्षा जांचों को नहीं दिखा रहा हूं जो मेरे पास हैं आदि।

आदर्श न होने पर भी - मुझे यह एक वैध विकल्प लगता है ताकि आपको पुनः आरंभ करने के लिए एक अलग ऐप न रखना पड़े।


1
IMHO कि इस के लिए एक neater समाधान है। मेरे पास एक उदाहरण होने की भी आवश्यकता है और उपयोगकर्ता को एप्लिकेशन को पुनरारंभ करने की अनुमति देता है (उदाहरण के लिए जब यह दुर्घटनाग्रस्त हो जाता है)। मैंने आपके समाधान को लगभग लागू कर दिया है, हालांकि यह मेरे लिए हुआ है कि बस एक अलग कमांड लाइन तर्क जोड़ना बेहतर होगा जो कई उदाहरणों को चलाने की अनुमति देता है ।
— डेनिस

मिमीम, आप तर्क को उलट रहे हैं - मुझे यह पसंद है! केवल मुद्दा यह है कि अगर किसी को cmd लाइन तर्क है कि कई उदाहरण अजीब सामान हो सकता है की अनुमति देता है: D
— JohnIdol

खैर, मैं भाग्यशाली था कि यह एक ऐसी विशेषता थी जो उपयोगकर्ताओं को विन-विन कर रही थी। मैं पसंद करूंगा कि वे एक /allowMultipleInstancesअजीब से एक झंडे को 'खोज' लेंगे /restart।
— डेनिस

हाँ यदि आप कई उदाहरणों के लिए अनुमति देते हैं जो सुनिश्चित करने के लिए एक बेहतर समाधान है :)
— JohnIdol

@ जॉनीडॉल नाइस। मुझे लगता है कि मैं अपने ध्वज को "-waitForProcessToExit" या कुछ और बदल दूंगा, लेकिन अन्यथा यह एक अधिक सुंदर समाधान है। अभी मैं एक ClickEce समस्या से जूझ रहा हूँ एक और EXE से एक EXE का संदर्भ देने के साथ, और इससे यह हल हो जाएगा।
— HiredMind

6

प्रारंभ / निकास विधि

// 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);

यह Application.Restart () से बेहतर काम करने लगता है;

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


2
यदि अनुप्रयोग कई उदाहरणों से सुरक्षित है, तो यह काम नहीं कर सकता है।
— मेजकिनटोर

याह, मेरे पास एक भावना है, जो अनुप्रयोग। एक्सिट () केवल कुछ संदेश को कतार में जोड़ने का कारण बनता है जिसे कहीं भी पंप करने की आवश्यकता होती है, इसलिए मेरे जवाब में यहां कोड का दूसरा बिट शायद काम नहीं करेगा।
— एडम नोफ़्सिंगर

दुर्भाग्य से यह तकनीक काम नहीं करती है (मैं चाहता हूं कि यह किया है! यह मेरे समाधान की तुलना में बहुत सरल है)। यह विज़ुअल स्टूडियो डीबगर के अंदर काम करेगा लेकिन व्यवहार में नहीं। डीबगर के बाहर काम करने वाले कुल्डी समाधान के लिए मेरा उत्तर देखें।
— HiredMind

HiredMind सही हो सकता है। मैंने एक वॉचडॉग पैटर्न समाधान के साथ जाना समाप्त कर दिया।
— एडम नोफ़िंगर

6

इसका सिंपल आपको बस उन Application.Restart()तरीकों को कॉल करने की आवश्यकता है जो आपको पुनः आरंभ करने के लिए आवेदन आमंत्रित करने के लिए कहते हैं। लेकिन आपको स्थानीय परिवेश से उनके त्रुटि कोड से बाहर निकलना होगा:

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

आप त्रुटि कोड की गणना कर सकते हैं, जिसके लिए आप इसका उपयोग आसानी से कर सकते हैं।
एक अन्य तरीका यह है कि केवल आवेदन से बाहर निकलें और निष्पादन योग्य पथ की प्रक्रिया शुरू करें:

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

मेरे लिए अच्छी तरह से काम किया, मेरे मामले में वॉचडॉग ऐप की कोई आवश्यकता नहीं है।
— user685590

3

इस कोड को आज़माएं:

bool appNotRestarted = true;

यह कोड फ़ंक्शन में भी होना चाहिए:

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

3

मुझे एक और उपाय सूझा, शायद कोई भी इसका उपयोग कर सकता है।

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

कोड सरल है इसलिए अपवाद और सामान का ख्याल रखें;)


2

आप कमांड-लाइन विकल्पों / मापदंडों को भूल रहे हैं जो आपके वर्तमान में चल रहे उदाहरण में पारित किए गए थे। यदि आप उन लोगों को पास नहीं करते हैं, तो आप वास्तविक पुनरारंभ नहीं कर रहे हैं। Process.StartInfoअपनी प्रक्रिया के मापदंडों के क्लोन के साथ सेट करें , फिर एक शुरुआत करें।

उदाहरण के लिए, यदि आपकी प्रक्रिया के रूप में शुरू किया गया था, तो आपकी myexe -f -nosplash myfile.txtविधि केवल myexeउन सभी झंडे और मापदंडों के बिना निष्पादित होगी ।


2

मैं चाहता था कि पुराने एक के बाद नया आवेदन शुरू हो जाए।

प्रक्रिया का उपयोग करना। शटडाउन के लिए खुद की प्रक्रिया का इंतजार करने के लिए IaFForExit () का कोई मतलब नहीं है। यह हमेशा बाहर समय होगा।

इसलिए, मेरा दृष्टिकोण Application.Exit () का उपयोग करना है, फिर प्रतीक्षा करें, लेकिन घटनाओं को संसाधित करने की अनुमति दें, समय की अवधि के लिए। फिर पुराने के समान तर्कों के साथ एक नया एप्लिकेशन शुरू करें।

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

आप रेस्टोरर का उपयोग भी कर सकते हैं ।

रेस्टोरर एक ऐसा एप्लिकेशन है जो स्वचालित रूप से मॉनिटर और पुनरारंभ हो जाता है और प्रोग्राम और एप्लिकेशन को लटका देता है। यह मूल रूप से गेम सर्वर की निगरानी और पुनरारंभ करने के लिए विकसित किया गया था, लेकिन यह किसी भी कंसोल या फॉर्म आधारित प्रोग्राम या एप्लिकेशन के लिए काम करेगा


1
आपूर्ति की गई लिंक अब काम नहीं करती है, लेकिन मुझे लगता है कि CNET पर यह एक ही एप्लीकेशन है: download.cnet.com/Restarter/3000-2094_4-75810552.html
— सर्फबटलर

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 आपकी एप्लायंस .exe फ़ाइल पथ लौटाता है कृपया कॉल के क्रम का पालन करें। आप इसे एक कोशिश-पकड़ खंड में रखना चाह सकते हैं।


1

बैट फ़ाइल बनाने के बारे में, बंद करने से पहले बैच फ़ाइल को चलाएं, और फिर वर्तमान उदाहरण को बंद करें।

बैच फ़ाइल यह करता है:

  1. यह देखने के लिए कि क्या प्रक्रिया समाप्त हो गई है, एक लूप में प्रतीक्षा करें।
  2. प्रक्रिया शुरू करें।

जो एक गरीब आदमी का प्रहरी आवेदन है, जिसका मैं ऊपर थोड़ा और विस्तृत वर्णन करता हूं। एक वास्तविक प्रहरी के आवेदन का मुख्य लाभ यह है कि मूल एप्लिकेशन को कुछ बंद स्पिन करने में सक्षम होने के बावजूद मर जाएगा।
— एडम नोफ़्सिंगर

@AdamNofsinger मैं अब देख रहा हूं। मुझे वह टिप्पणी याद आ गई। आप अपनी पोस्ट को उस समाधान के साथ संपादित करना चाह सकते हैं जिसका आप उपयोग करते हैं।
— अज।

1

यहाँ मेरे 2 सेंट हैं:

अनुक्रम नई आवृत्ति प्रारंभ करें -> वर्तमान प्रवाह बंद करें उन अनुप्रयोगों के लिए भी काम करना चाहिए जो एक साथ कई प्रतियों को चलाने की अनुमति नहीं देते हैं क्योंकि इस मामले में नया उदाहरण एक कमांड-लाइन तर्क पारित किया जा सकता है जो इंगित करेगा कि प्रगति में फिर से शुरू है। इसलिए चल रहे अन्य उदाहरणों के लिए जाँच आवश्यक नहीं होगी। पहले उदाहरण के लिए प्रतीक्षा करना वास्तव में मेरे खत्म होने पर भी लागू किया जाना चाहिए अगर यह बिल्कुल जरूरी है कि कोई भी दो अंतर समानांतर में नहीं चल रहे हैं।


1

मुझे डर है कि प्रक्रिया का उपयोग करके पूरे एप्लिकेशन को पुनरारंभ करने से आपकी समस्या गलत तरीके से आ रही है।

एक आसान तरीका है Program.cs फ़ाइल को पुनरारंभ करने के लिए संशोधित करना:

    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
यह ध्यान देने योग्य है कि इस समाधान के साथ आप एप्लिकेशन को एक्स बार पुनरारंभ कर सकते हैं, फिर उसके बाद एक अनन्त लूप से बचने के लिए आवेदन छोड़ दें।
— RooiWillie

धन्यवाद @RooiWillie मैंने ऐसा करने के लिए एक काउंटर जोड़ा है, यदि कार्यक्रम सामान्य रूप से बाहर नहीं निकल सकता है।
— एंड्रयू

0

मुझे भी इसी तरह की समस्या थी, लेकिन मेरा संबंध असहनीय स्मृति रिसाव से था, जो मुझे एक ऐप पर नहीं मिल रहा था जिसे 24/7 चलाना है। ग्राहक के साथ मैं इस बात पर सहमत था कि यदि मेमोरी की निर्धारित मात्रा से अधिक है तो ऐप को पुनः आरंभ करने का सुरक्षित समय 03:00 AM है।

मैंने कोशिश की Application.Restart, लेकिन जब से यह कुछ तंत्र का उपयोग करने लगता है जो नई आवृत्ति शुरू करता है जबकि यह पहले से ही चल रहा है, मैं दूसरी योजना के लिए चला गया। मैंने उस तरकीब का इस्तेमाल किया जो फ़ाइल सिस्टम हैंडल तब तक कायम रहती है जब तक कि प्रक्रिया उनकी मृत्यु न कर दे। इसलिए, अनुप्रयोग से, मैंने फ़ाइल को डिस्क पर गिरा दिया, और Dispose()हैंडल नहीं किया। मैंने 'खुद को' निष्पादन योग्य और आरंभिक निर्देशिका (लचीलापन जोड़ने के लिए) भेजने के लिए फ़ाइल का उपयोग किया।

कोड:

_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()अंत में ऐप शटडाउन शुरू होगा, और मैं StreamWriterयहाँ इस्तेमाल के लिए फ़ाइल हैंडल को तब तक खुला रखा जाएगा जब तक कि प्रक्रिया वास्तव में मर नहीं जाती। फिर...

Restarter.exe कार्रवाई में आता है। यह फ़ाइल को अनन्य मोड में पढ़ने की कोशिश करता है, इसे तब तक एक्सेस करने से रोकता है जब तक कि मुख्य ऐप मृत न हो, फिर मुख्य ऐप शुरू करता है, फ़ाइल को हटाता है और मौजूद होता है। मुझे लगता है कि यह सरल नहीं हो सकता है:

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

मैं निम्नलिखित का उपयोग करता हूं और यह वही करता है जो आप देख रहे हैं:

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

लॉगआउट के रूप में उपयोग करने के लिए आपको राम कैश से सभी एप्लिकेशन को समाप्त करने की आवश्यकता है इसलिए पहले एप्लिकेशन को बंद करें और फिर इसे फिर से चलाएँ

// लॉगआउट बटन पर क्लिक करने पर

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

0

Application.Restart () का उपयोग करने की समस्या यह है कि यह एक नई प्रक्रिया शुरू करता है लेकिन "पुराना" अभी भी शेष है। इसके बाद मैंने निम्नलिखित कोड स्निपेट का उपयोग करके पुरानी प्रक्रिया को मारने का निर्णय लिया:

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

और यह उचित अच्छा काम करता है। मेरे मामले में MATLAB और C # एप्लिकेशन समान SQLite डेटाबेस साझा कर रहे हैं। यदि MATLAB डेटाबेस का उपयोग कर रहा है, तो फॉर्म-ऐप को फिर से (+ उलटी गिनती) फिर से शुरू करना चाहिए, जब तक कि MATLAB डेटाबेस में अपने व्यस्त बिट को रीसेट न कर दे। (सिर्फ पक्ष जानकारी के लिए)


0

आप किसी फ़ंक्शन के अंदर अपना कोड संलग्न कर सकते हैं और जब पुनरारंभ की आवश्यकता होती है तो आप फ़ंक्शन को कॉल कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.