कंसोल विंडो बंद होने के तुरंत बाद मेरा आउटपुट क्यों प्रदर्शित होता है?


158

मैं MSDN में गाइडों का पालन करके C # का अध्ययन कर रहा हूं ।

अब, मैंने सिर्फ उदाहरण 1 की कोशिश की ( यहाँ MSDN का लिंक है ), और मैंने एक समस्या का सामना किया है: मेरे उत्पादन को प्रदर्शित करने के तुरंत बाद कंसोल विंडो बंद क्यों हो रही है?

using System;

public class Hello1
{
    public static int Main()
    {
        Console.WriteLine("Hello, World!");
        return 0;
    }
}

आप कंसोल के साथ खोलने की कोशिश कर सकते हैं। कंसोल पर खींचें और छोड़ें और "एंटर" दबाएं। मैं इसकी एक EXE फ़ाइल मान।
साजिदुर रहमान

यदि आप एक कमांड लाइन प्रोग्राम को डिबग करने की कोशिश कर रहे हैं, जो एक बाहरी प्रक्रिया द्वारा शुरू किया गया है, तो यह प्रश्न देखें: stackoverflow.com/a/23334014/3195477
UUDdLrLrSs

जवाबों:


266

यहाँ मुद्दा यह है कि उनका हैलो वर्ल्ड प्रोग्राम दिखाई दे रहा है तो यह तुरंत बंद हो जाएगा।
ऐसा क्यों है?

क्योंकि यह समाप्त हो गया है। जब कंसोल एप्लिकेशन ने निष्पादन और अपनी mainविधि से वापसी पूरी कर ली है , तो संबंधित कंसोल विंडो स्वचालित रूप से बंद हो जाती है। यह अपेक्षित व्यवहार है।

यदि आप इसे डिबगिंग उद्देश्यों के लिए खुला रखना चाहते हैं, तो आपको ऐप को समाप्त करने और विंडो को बंद करने से पहले कंप्यूटर को एक प्रमुख प्रेस की प्रतीक्षा करने का निर्देश देना होगा।

Console.ReadLineविधि ऐसा करने का एक तरीका है। इस लाइन को अपने कोड के अंत में जोड़ने ( returnकथन से ठीक पहले ) के कारण आपके द्वारा बाहर निकलने से पहले किसी कुंजी को दबाने के लिए इंतजार करना पड़ेगा।

वैकल्पिक रूप से, आप विज़ुअल स्टूडियो वातावरण के भीतर से Ctrl+ दबाकर डिबगर के बिना आवेदन शुरू कर सकते F5हैं, लेकिन इससे आपको डीबगिंग सुविधाओं का उपयोग करने से रोकने का स्पष्ट नुकसान है, जिसे आप आवेदन लिखते समय संभवतः अपने निपटान में चाहते हैं।

सबसे अच्छा समझौता संभवतः Console.ReadLineविधि को कॉल करने के लिए होता है जब एप्लिकेशन को प्रीप्रोसेसर निर्देश में लपेटकर डीबग करना। कुछ इस तरह:

#if DEBUG
    Console.WriteLine("Press enter to close...");
    Console.ReadLine();
#endif

आप यह भी चाह सकते हैं कि यदि कोई अपवाद छोड़ दिया गया तो खिड़की खुली रह सकती है। ऐसा करने के लिए आप Console.ReadLine();एक finallyब्लॉक में रख सकते हैं :

#if DEBUG
    try
    {
        //...
    }
    finally
    {
        Console.WriteLine("Press enter to close...");
        Console.ReadLine();
    }
#endif

18
वैकल्पिक रूप से, आप Console.ReadKey () का उपयोग कर सकते हैं;
प्लांटेशनगेटर

55
व्यक्तिगत रूप से, मुझे पसंद है if (System.Diagnostics.Debugger.IsAttached) Console.ReadLine();
समीर सिंह

5
डिबगिंग के बिना चलने वाला व्यवहार क्यों बदलता है? आपको लगता है कि यह अधिक सटीक अनुभव होना चाहिए, कम नहीं।
काइल डेलानी

@SameerSingh अनावश्यक कोड की एक और पंक्ति आपके बाइनरी में संकलित की जा रही है। मैं वास्तव में इस प्रीप्रोसेसर दृष्टिकोण को पसंद करता हूं।
जोएल

@Joel, हमें सामान्य रूप से इन दिनों की परवाह क्यों करनी चाहिए?
एलेक्स

66

के बजाय का उपयोग करने का

Console.Readline()
Console.Read()
Console.ReadKey()

आप Ctrl+ F5(यदि आप विज़ुअल स्टूडियो में हैं) का उपयोग करके अपना कार्यक्रम चला सकते हैं। तब विजुअल स्टूडियो कंसोल विंडो को खुला रखेगा, जब तक आप एक कुंजी दबाते हैं।

नोट: आप इस दृष्टिकोण में अपना कोड डीबग नहीं कर सकते।


हाय यूजर। मैं सामान्य रूप से VS और C # का नया उपयोगकर्ता हूं। क्या Ctrl + F5अलग करता है कि बस बहुत Startअलग ढंग से करते हैं?
theGreenCabbage

दुर्भाग्य से, कभी-कभी यह उम्मीद के मुताबिक काम करना बंद कर देता है।
MaikoID

2
समस्या का कारण यह है कि प्रोग्राम बंद होने पर विंडो स्वचालित रूप से टर्मिनल विंडो को बंद कर देती है। अन्य सिस्टम विंडो को अपने आप ओपन रखेंगे। यह कार्यक्रम को चलाने का सबसे बेहतर तरीका है। इस सामग्री के लिए ReadKey, Read या ReadLine का उपयोग न करें क्योंकि यह आपके प्रोग्राम को अन्य कंसोल एप्लिकेशन और पाइपिंग के साथ संयोजन में उपयोग करने से रोकता है।
रीयलटाइम

14

मुझे लगता है कि आप इसे डिबग मोड में बंद नहीं करना चाहते हैं, इसका कारण यह है कि आप चर आदि के मूल्यों को देखना चाहते हैं, इसलिए संभवतः मुख्य फ़ंक्शन के समापन "}" पर ब्रेक-पॉइंट डालना सबसे अच्छा है। । यदि आपको डीबग करने की आवश्यकता नहीं है, तो Ctrl-F5 सबसे अच्छा विकल्प है।


आश्चर्यचकित अन्य किसी भी उत्तर ने यह सुझाव नहीं दिया। यह दुर्लभ है कि एक नए विकल्प के साथ एक उत्तर जो प्रश्न बनने के बाद इतनी देर से जोड़ा जाता है।
स्कॉट चैंबरलेन

13

यह CtrlF5या के लिए एक ही व्यवहार करता है F5Mainविधि के अंत से तुरंत पहले रखें ।

using System.Diagnostics;

private static void Main(string[] args) {

  DoWork();

  if (Debugger.IsAttached) {
    Console.WriteLine("Press any key to continue . . .");
    Console.ReadLine();
  }
}

7
बस ध्यान दें, Console.ReadKey()किसी भी कुंजी के लिए अंतिम पंक्ति होनी चाहिए , Console.ReadLine()प्रवेश के लिए प्रतीक्षा करने के लिए दबाया जाना चाहिए
क्रिस

6

कार्यक्रम तुरंत बंद हो जाता है क्योंकि इसे बंद करने से कुछ नहीं होता है। प्रोग्राम को बंद होने से रोकने के return 0;लिए Console.Read();पहले एक ब्रेकपॉइंट डालें या जोड़ें return 0;


5

मुझे पार्टी में थोड़ी देर हो गई है, लेकिन: .NET कोर परियोजनाओं के लिए विजुअल स्टूडियो 2019 में कंसोल डिफ़ॉल्ट रूप से स्वचालित रूप से बंद नहीं होता है। आप मेनू टूल के माध्यम से व्यवहार को कॉन्फ़िगर कर सकते हैं → विकल्प → डिबगिंग → सामान्य → डिबगिंग बंद होने पर कंसोल को स्वचालित रूप से बंद करें। यदि आपको अपनी कंसोल विंडो अपने आप बंद हो जाती है, तो जांच लें कि क्या उल्लेखित सेटिंग सेट नहीं है।

यही बात .NET फ्रेमवर्क नई शैली कंसोल प्रोजेक्ट्स पर लागू होती है:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net472</TargetFramework>
  </PropertyGroup>

</Project>

पुरानी शैली .NET फ्रेमवर्क परियोजना अभी भी अंत में कंसोल को बंद करती है (दृश्य स्टूडियो 16.0.1 के रूप में)।

संदर्भ: https://devblogs.microsoft.com/dotnet/net-core-tooling-update-for-visual-studio-2019-preview-2/


यह विकल्प मेरे लिए VS2017 15.9.4 में उपलब्ध है, लेकिन यह मेरे .net कोर 2.1 कंसोल एप्लिकेशन के लिए काम नहीं कर रहा है ...
user1073075

@ user1073075: यह अजीब है। क्या फीचर अन्य लक्ष्यों के लिए काम करता है?
व्लाद

कोई .NET फ्रेमवर्क कंसोल ऐप के साथ प्रयास किया गया और फिर भी काम नहीं किया। (मैंने VS2019 को एक अलग मशीन पर स्थापित किया है और वहां यह काम करता है। हो सकता है कि यह VS17 15.9.4 में एक बग हो)
user1073075

2019 के साथ अब यह WPF परियोजनाओं के लिए भी काम करता है: pastebin.com/FpAeV0cW । लेकिन आपको .NET कोर 3.
व्लाद

5

यदि आप अपने आवेदन को खोलकर रखना चाहते हैं, तो आपको इसकी प्रक्रिया को जीवित रखने के लिए कुछ करना होगा। नीचे दिया गया उदाहरण सबसे सरल है, जिसे आपके कार्यक्रम के अंत में रखा जाना है:

while (true) ;

हालाँकि, यह सीपीयू को अधिक भार का कारण बना देगा, क्योंकि यह इसलिए असीम रूप से पुनरावृति के लिए मजबूर है।

इस बिंदु पर, आप System.Windows.Forms.Applicationकक्षा का उपयोग करने का विकल्प चुन सकते हैं (लेकिन इसके लिए आपको System.Windows.Formsसंदर्भ जोड़ना होगा ):

Application.Run();

यह CPU को लीक नहीं करता है और सफलतापूर्वक काम करता है।

System.Windows.Formsसंदर्भ जोड़ने से बचने के लिए , आप एक साधारण चाल का उपयोग कर सकते हैं, तथाकथित स्पिन प्रतीक्षा , आयात कर रहे हैंSystem.Threading :

SpinWait.SpinUntil(() => false);

यह भी पूरी तरह से काम करता है, और इसमें मूल रूप whileसे एक नकारात्मक स्थिति के साथ एक लूप शामिल होता है जो उपरोक्त लैम्बडा विधि द्वारा वापस किया जाता है। क्यों यह सीपीयू अधिभार नहीं है? आप यहां स्रोत कोड देख सकते हैं ; वैसे भी, यह मूल रूप से खत्म होने से पहले कुछ सीपीयू चक्र की प्रतीक्षा करता है।

आप एक संदेश लूपर भी बना सकते हैं, जो सिस्टम से लंबित संदेशों को पेश करता है और उनमें से प्रत्येक को अगले पुनरावृत्ति में जाने से पहले संसाधित करता है, इस प्रकार है:

[DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode, DllImport("user32.dll", EntryPoint = "PeekMessage")]
public static extern int PeekMessage(out NativeMessage lpMsg, IntPtr hWnd, int wMsgFilterMin, int wMsgFilterMax, int wRemoveMsg);

[DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode, DllImport("user32.dll", EntryPoint = "GetMessage")]
public static extern int GetMessage(out NativeMessage lpMsg, IntPtr hWnd, int wMsgFilterMin, int wMsgFilterMax);

[DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode, DllImport("user32.dll", EntryPoint = "TranslateMessage")]
public static extern int TranslateMessage(ref NativeMessage lpMsg);

[DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode, DllImport("user32.dll", EntryPoint = "DispatchMessage")]
public static extern int DispatchMessage(ref NativeMessage lpMsg);

[DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode]
public static bool ProcessMessageOnce()
{
    NativeMessage message = new NativeMessage();

    if (!IsMessagePending(out message))
        return true;

    if (GetMessage(out message, IntPtr.Zero, 0, 0) == -1)
        return true;

    Message frameworkMessage = new Message()
    {
        HWnd = message.handle,
        LParam = message.lParam,
        WParam = message.wParam,
        Msg = (int)message.msg
    };

    if (Application.FilterMessage(ref frameworkMessage))
        return true;

    TranslateMessage(ref message);
    DispatchMessage(ref message);

    return false;
}

फिर, आप कुछ ऐसा करके सुरक्षित रूप से लूप कर सकते हैं:

while (true)
    ProcessMessageOnce();

मुझे नहीं पता कि यह सीपीयू लीक है या नहीं लेकिन; सफलतापूर्वक काम करता है। धन्यवाद।
मुमिन का

4

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

System.Threading.Thread.Sleep(1000);

ध्यान दें कि Sleepमिलीसेकंड का उपयोग कर रहा है।


4

एक अन्य तरीका Debugger.Break()मुख्य विधि से लौटने से पहले उपयोग करना है


यद्यपि यह स्विच डिबगर विंडो पर वापस केंद्रित होता है और संभवतः कंसोल विंडो की सामग्री को छुपाता है।
स्टीफन टर्नर

3

कोड समाप्त हो गया है, इसे जारी रखने के लिए आपको इसे जोड़ना होगा:

Console.ReadLine();

या

Console.Read();

3

कंसोल का उपयोग करें। रीड (); प्रोग्राम को बंद होने से रोकने के लिए, लेकिन सुनिश्चित करें कि आप Console.Read();रिटर्न स्टेटमेंट से पहले कोड जोड़ लें , वरना यह अनुपलब्ध कोड होगा।

    Console.Read(); 
    return 0; 

इस कंसोल की जाँच करें


3

Readआउटपुट दिखाने के लिए विधि जोड़ें ।

Console.WriteLine("Hello, World!");
Console.Read();
return 0;


0

जैसे ही यह निष्पादन पूर्ण होता है, यह कार्यक्रम बंद हो रहा है। इस मामले में जब आप return 0;। यह अपेक्षित कार्यक्षमता है। यदि आप आउटपुट देखना चाहते हैं, तो या तो इसे टर्मिनल में मैन्युअल रूप से चलाएं या प्रोग्राम के अंत में प्रतीक्षा करें ताकि यह कुछ सेकंड के लिए खुला रहे (थ्रेडिंग लाइब्रेरी का उपयोग करके)।


0

यह C # में कंसोल ऐप पर आंसर की है?

सांत्वना ऐप में कभी भी कुछ भी उपयोग awaitन करें theAsyncMethod().GetAwaiter().GetResult();, बल्कि उपयोग करें ,

उदाहरण

var result = await HttpClientInstance.SendAsync(message);

हो जाता है

var result = HttpClientInstance.SendAsync(message).GetAwaiter().GetResult();


-3

यदि आपके कार्यक्रम को आपको जारी रखने के लिए एंटर प्रेस करने की आवश्यकता है जैसे आपको एक मूल्य दर्ज करना है और जारी रखना है, तो एक नया डबल या इंट जोड़ें और रिटुनर (0) से पहले लिखें; scanf_s ("% lf", और चर);


1
यह एक C # प्रश्न है।
वाई हा ली

-3

मैं हमेशा निम्न कथन को एक कंसोल एप्लिकेशन में जोड़ता हूं। (यदि आप चाहें तो इसके लिए एक कोड स्निपेट बनाएं)

Console.WriteLine("Press any key to quit!");
Console.ReadKey();

ऐसा करने से मदद मिलती है जब आप कंसोल एप्लिकेशन के माध्यम से विभिन्न अवधारणाओं का प्रयोग करना चाहते हैं।

सीटीआर + एफ 5 कंसोल को बनाएगा लेकिन आप डिबग नहीं कर सकते हैं! सभी सांत्वना अनुप्रयोग जो मैंने realworld में लिखे हैं, हमेशा गैर-संवादात्मक होते हैं और एक अनुसूचक द्वारा ट्रिगर किया जाता है जैसे कि TWS या CA वर्क स्टेशन।


-3

अन्य क्या कह रहे हैं, इसे सरल बनाने के लिए: उपयोग करें Console.ReadKey();

यह बनाता है इसलिए यह प्रोग्राम उपयोगकर्ता को कीबोर्ड पर एक सामान्य कुंजी दबाने के लिए इंतजार कर रहा है

स्रोत: मैं इसे अपने कार्यक्रमों में कंसोल अनुप्रयोगों के लिए उपयोग करता हूं।


-3

आप इसे बहुत ही सरल तरीके से हल कर सकते हैं बस इनपुट का आह्वान करें। हालाँकि, यदि आप दबाते हैं Enterतो कंसोल फिर से गायब हो जाएगा। बस इस का उपयोग करें Console.ReadLine();याConsole.Read();


-4

वापसी से पहले निम्नलिखित जोड़ें:

system("PAUSE");  

यह विंडो को बंद करने के लिए एक कुंजी को हिट करने के लिए एक रेखा प्रिंट करता है। यह विंडो को तब तक बनाए रखेगा जब तक आप एंटर की को हिट नहीं करते हैं। मेरे पास मेरे छात्र इसे अपने सभी कार्यक्रमों में शामिल करते हैं।


1
Thats c ++ में है
Gonçalo Garrido

-13

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

कार्यक्रम में

उदाहरण के लिए:

static void Main(string[] args)
{
    label:

    // Snippet of code

    goto label;
}

2
यह सिर्फ पोस्टर प्रोग्राम को "हैलो, वर्ल्ड!" कई बार
डेविडपोस्टिल

1
जीसस क्राइस्ट, को पता नहीं था कि gotoकथन को C # में भी अनुमति दी गई थी।
चिशायर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.