কনসোল উইন্ডোটি বন্ধ হয়ে যাওয়ার সাথে সাথেই একবার আমার আউটপুট প্রদর্শিত হবে?


158

আমি এমএসডিএন- র গাইড অনুসরণ করে সি # অধ্যয়ন করছি ।

এখন, আমি কেবল উদাহরণ 1 টি চেষ্টা করেছি ( এখানে এমএসডিএন এর লিঙ্কটি রয়েছে ), এবং আমি একটি সমস্যার মুখোমুখি হয়েছি: কেন কনসোল উইন্ডোটি অবিলম্বে আমার আউটপুট প্রদর্শিত হবে?

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অ্যাপ্লিকেশনটিকে প্রিপ্রসেসর নির্দেশিকায় মোড়ক দিয়ে ডিবাগ করার সময় কেবল পদ্ধতিটিকে কল করা ভাল আপোস probably কিছুটা এইরকম:

#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
পর্যায়ক্রমে, আপনি কনসোল ব্যবহার করতে পারেন e রিডকি ();
প্ল্যান্টেশনগেটর

55
ব্যক্তিগতভাবে, আমি পছন্দ করি if (System.Diagnostics.Debugger.IsAttached) Console.ReadLine();
সমীর সিং

5
ডিবাগিং ছাড়াই দৌড়ানো কেন সেই আচরণ পরিবর্তন করে? আপনি মনে করেন এটি আরও সঠিক অভিজ্ঞতা হওয়া উচিত, কম নয়।
কাইল

@ সমীরসিংহ অপ্রয়োজনীয় কোডের আরও একটি লাইন আপনার বাইনারিতে সংকলিত হচ্ছে। আমি আসলে এই প্রিপ্রোসেসর পদ্ধতির পছন্দ করি।
জোয়েল

@ জোয়েলকে কেন আজকাল আমাদের সাধারণভাবে যত্ন নেওয়া উচিত?
অ্যালেক্স

66

পরিবর্তে ব্যবহার

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

আপনি Ctrl+ F5(যদি আপনি ভিজ্যুয়াল স্টুডিওতে থাকেন) ব্যবহার করে আপনার প্রোগ্রামটি চালাতে পারেন। তারপরে ভিজ্যুয়াল স্টুডিও কনসোল উইন্ডোটি খোলা রাখবে, যতক্ষণ না আপনি কোনও কী চাপবেন না।

দ্রষ্টব্য: আপনি এই পদ্ধতির মাধ্যমে আপনার কোডটি ডিবাগ করতে পারবেন না।


হাই ব্যবহারকারী আমি সাধারণভাবে ভিএস এবং সি # তেও একজন নতুন ব্যবহারকারী। কী Ctrl + F5ভিন্নভাবে যে কেবল চমত্কার Startভিন্নভাবে না?
দ্য গ্রিনক্যাবেজ

দুর্ভাগ্যক্রমে, কখনও কখনও এটি প্রত্যাশা অনুযায়ী কাজ করা বন্ধ করে দেয়।
মাইকোআইডি

2
সমস্যার কারণ হ'ল প্রোগ্রামটি বন্ধ হয়ে গেলে উইন্ডোজ স্বয়ংক্রিয়ভাবে টার্মিনাল উইন্ডোটি বন্ধ করে দেয়। অন্যান্য সিস্টেমগুলি উইন্ডোটি স্বয়ংক্রিয়ভাবে উন্মুক্ত রাখবে। এটি প্রোগ্রাম চালানোর জন্য আরও ভাল উপায়। এই স্টাফের জন্য রিডকি, রিড বা রিডলাইন ব্যবহার করবেন না কারণ এটি আপনার কনসোল অ্যাপ্লিকেশন এবং পাইপিংয়ের সাথে একত্রে আপনার প্রোগ্রামটি ব্যবহারে বাধা দেয়।
রিয়েলটাইম

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

প্রোগ্রামটি অবিলম্বে বন্ধ হয়ে যায় কারণ এটিকে বন্ধ হতে কিছুতেই থামছে না। প্রোগ্রামটি বন্ধ হতে আটকাতে একটি ব্রেকপয়েন্ট Inোকান return 0;বা Console.Read();আগে যুক্ত করুন return 0;


5

আমি পার্টিতে কিছুটা দেরি করেছি, কিন্তু:। নেট কোর প্রকল্পগুলির জন্য ভিজ্যুয়াল স্টুডিও 2019-এ কনসোলটি ডিফল্টরূপে স্বয়ংক্রিয়ভাবে বন্ধ হয় না। আপনি মেনুগুলির মাধ্যমে আচরণটি কনফিগার করতে পারেন সরঞ্জামগুলি → বিকল্পগুলি → ডিবাগিং → সাধারণ deb ডিবাগিং বন্ধ হয়ে গেলে কনসোলটি স্বয়ংক্রিয়ভাবে বন্ধ করুন। যদি আপনি আপনার কনসোল উইন্ডোটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়, তবে উল্লিখিত সেটিংসটি সেট করা নেই কিনা তা পরীক্ষা করে দেখুন।

। নেট ফ্রেমওয়ার্ক নতুন স্টাইলের কনসোল প্রকল্পগুলিতে এটি একই প্রযোজ্য:

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

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

</Project>

পুরানো স্টাইল। নেট ফ্রেমওয়ার্ক প্রকল্পটি এখনও নিঃশর্তভাবে শেষে কনসোলটি বন্ধ করে দেয় (ভিজ্যুয়াল স্টুডিও 16.0.1 হিসাবে)।

তথ্যসূত্র: https://devblogs.microsoft.com/dotnet/net-core-tooling-update-for-visual-studio-2019-preview-2/


এই বিকল্পটি আমার জন্য ভিএস2017 15.9.4 এ উপলব্ধ তবে এটি আমার। নেট কোর 2.1 কনসোল অ্যাপ্লিকেশনটির জন্য কাজ করছে না ...
ব্যবহারকার 1073075

@ ব্যবহারকারী 1073075: এটি আশ্চর্যজনক। বৈশিষ্ট্যটি কি অন্যান্য লক্ষ্যগুলির জন্য কাজ করে?
ভ্লাদ

না। NET ফ্রেমওয়ার্ক কনসোল অ্যাপ্লিকেশন দিয়ে চেষ্টা করা হয়েছে এবং এখনও কার্যকর হয়নি। (আমি একটি ভিন্ন মেশিনে VS2019 ইনস্টল করেছি এবং এটি সেখানে কাজ করে Maybe সম্ভবত এটি ভিএস 17 15.9.4 এ একটি বাগ)
ব্যবহারকারী 1073075

2019 এর সাথে এটি এখন ডাব্লুপিএফ প্রকল্পগুলির জন্যও কাজ করে: পেস্টবিন . com/এফপিএইভি 0cW । তবে আপনাকে। নেট কোর 3. ইনস্টল করতে হবে
ভ্লাদ

5

আপনি যদি নিজের অ্যাপ্লিকেশনটি খোলা রাখতে চান তবে এর প্রক্রিয়াটি বাঁচিয়ে রাখতে আপনাকে কিছু করতে হবে। নীচের উদাহরণটি আপনার প্রোগ্রামের শেষে রাখা সহজতম উদাহরণ:

while (true) ;

যাইহোক, এটি সিপিইউকে ওভারলোডের কারণ হিসাবে গ্রহণ করবে কারণ এটি অসীমভাবে পুনরাবৃত্তি করতে বাধ্য হয়।

এই মুহুর্তে, আপনি System.Windows.Forms.Applicationক্লাস ব্যবহার করতে বেছে নিতে পারেন (তবে এটির জন্য আপনাকে System.Windows.Formsরেফারেন্স যুক্ত করতে হবে ):

Application.Run();

এটি সিপিইউ ফাঁস করে না এবং সফলভাবে কাজ করে।

System.Windows.Formsরেফারেন্স যুক্ত করতে এড়ানোর জন্য , আপনি একটি সাধারণ কৌশল ব্যবহার করতে পারেন, তথাকথিত স্পিন অপেক্ষারত , আমদানি System.Threading:

SpinWait.SpinUntil(() => false);

এটিও নিখুঁতভাবে কাজ করে এবং এটি মূলত whileউপরের ল্যাম্বডা পদ্ধতি দ্বারা প্রত্যাবর্তিত অবস্থার সাথে একটি লুপ থাকে consists কেন এই ওভারলোডিং সিপিইউ নয়? আপনি এখানে সোর্স কোডটি দেখতে পারেন ; যাইহোক, এটি মূলত ওভারটি করার আগে কিছু সিপিইউ চক্র অপেক্ষা করে।

আপনি একটি বার্তা লুপও তৈরি করতে পারেন, যা সিস্টেম থেকে মুলতুবি থাকা বার্তাগুলি উঁকি দেয় এবং পরবর্তী পুনরাবৃত্তিতে যাওয়ার আগে সেগুলির প্রতিটি প্রক্রিয়া করে:

[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; 

এই কনসোলটি পরীক্ষা করুন e


3

Readআউটপুটটি দেখানোর জন্য পদ্ধতিটি যুক্ত করুন ।

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


0

প্রোগ্রামটি কার্যকর হওয়ার সাথে সাথেই বন্ধ হয়ে যাবে। এই ক্ষেত্রে যখন আপনি return 0;। এটি কার্যকারিতা প্রত্যাশিত। আপনি যদি আউটপুটটি দেখতে চান তবে হয় এটি নিজে নিজে একটি টার্মিনালে চালান বা প্রোগ্রামের শেষে অপেক্ষা করুন যাতে এটি কয়েক সেকেন্ডের জন্য খোলা থাকে (থ্রেডিং লাইব্রেরি ব্যবহার করে)।


0

এটি সি # তে কনসোল অ্যাপে উত্তর অ্যাসিঙ্ক?

কনসোল অ্যাপ্লিকেশনটিতে যে কোনও কিছুই কখনও ব্যবহার না করে awaitপরিবর্তে ব্যবহার করুন theAsyncMethod().GetAwaiter().GetResult();,

উদাহরণ

var result = await HttpClientInstance.SendAsync(message);

হয়ে

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


-3

যদি আপনার প্রোগ্রামটির জন্য আপনাকে মানটি লিখতে হয় এবং চালিয়ে যেতে হয় তার জন্য আপনাকে এন্টার টিপতে হবে, তবে নতুন ডাবল বা ইনট যোগ করুন এবং টাইপ করুন (0) এর আগে লিখুন; স্ক্যানফ_স ("% এলএফ", এবং ভেরিয়েবল);


1
এটি একটি সি # প্রশ্ন।
ওয়াই হা লি

-3

আমি সবসময় নিম্নলিখিত বিবৃতিটি একটি কনসোল অ্যাপ্লিকেশনটিতে যুক্ত করি ((আপনি যদি চান তবে এর জন্য একটি কোড স্নিপেট তৈরি করুন)

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

আপনি যখন কনসোল অ্যাপ্লিকেশনটির মাধ্যমে বিভিন্ন ধারণাগুলি পরীক্ষা করতে চান এটি করতে সহায়তা করে।

Ctr + F5 কনসোলটি স্থির করে তুলবে তবে আপনি ডিবাগ করতে পারবেন না! আমি রিয়েলওয়ার্ল্ডে লিখেছি এমন সমস্ত কনসোল অ্যাপ্লিকেশনগুলি সর্বদা অ-ইন্টারেক্টিভ এবং টিডাব্লুএস বা সিএ ওয়ার্ক স্টেশন এর মতো শিডিয়ুলার দ্বারা ট্রিগার করা হয় এবং এর মতো কিছু প্রয়োজন হয় না।


-3

অন্যেরা যা বলছে তা সরল করতে: ব্যবহার করুন Console.ReadKey();

এটি এটি তৈরি করে যাতে প্রোগ্রামটি কীবোর্ডের একটি সাধারণ কী টিপতে ব্যবহারকারীটির জন্য অপেক্ষা করে

উত্স: আমি কনসোল অ্যাপ্লিকেশনগুলির জন্য এটি আমার প্রোগ্রামগুলিতে ব্যবহার করি।


-3

আপনি কেবল ইনপুটটি চাওয়া খুব সহজ উপায়ে এটি সমাধান করতে পারেন। তবে আপনি Enterযদি টিপেন তবে কনসোলটি আবার অদৃশ্য হয়ে যাবে। কেবল এই Console.ReadLine();বা ব্যবহার করুনConsole.Read();


-4

ফিরে আসার আগে নিম্নলিখিতটি যুক্ত করুন:

system("PAUSE");  

এটি উইন্ডোটি বন্ধ করার জন্য একটি কীতে আঘাত করতে একটি লাইন মুদ্রণ করে। আপনি কী কী টিপুন ততক্ষণ উইন্ডোটি উপরে থাকবে। আমার ছাত্ররা তাদের সমস্ত প্রোগ্রামে এটি যুক্ত করে have


1
থ্যাটস সি ++ এ রয়েছে
গোনালো গ্যারিডো

-13

আমার উদ্বেগ অনুসারে, আমরা যদি আউটপুট ডিসপ্লে ইউএসই বন্ধ না হওয়া অবধি কনসোল অ্যাপ্লিকেশনটির আউটপুট স্থিতিশীল করতে চাই তবে লেবেল: মেইনমেথোদ এবং গোটো লেবেলের পরে; প্রোগ্রাম শেষ হওয়ার আগে

প্রোগ্রামে।

উদাহরণ:

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

    // Snippet of code

    goto label;
}

2
এটি কেবল পোস্টার প্রোগ্রামগুলিকে "হ্যালো, ওয়ার্ল্ড!" প্রিন্ট করতে থাকবে অনেকবার
ডেভিডপস্টিল

1
যীশু খ্রীষ্ট, জানেন না gotoএমনকি সি # তেও বিবৃতি অনুমোদিত হয়েছিল।
Ch3shire
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.