2012-01-15 42 views
118

Tôi đã quyết định nghiên cứu một số C# cơ bản (mặc dù tôi có kinh nghiệm khi nói đến lập trình) điều tôi đang làm theo hướng dẫn trong MSDN, nhưng vấn đề ở đây là chương trình Hello World của họ hiển thị sau đó nó sẽ ngay lập tức gần. tại sao vậy?Tại sao cửa sổ bảng điều khiển đóng ngay lập tức mà không hiển thị đầu ra của tôi?

using System; 

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

Bạn có thể thử mở bằng bảng điều khiển. Kéo và thả nó trên giao diện điều khiển và nhấn "Enter". Tôi giả sử một tập tin EXE của nó. –

Trả lời

204

vấn đề ở đây là Chương trình Hello World của họ hiển thị sau đó chương trình sẽ đóng ngay lập tức.
tại sao vậy?

Vì đã hoàn tất. Khi ứng dụng bảng điều khiển đã hoàn thành việc thực thi và trở về từ phương thức main của chúng tôi, cửa sổ bảng điều khiển được liên kết sẽ tự động đóng. Đây là hành vi mong đợi.

Nếu bạn muốn giữ nó mở cho mục đích gỡ lỗi, bạn sẽ cần phải hướng dẫn máy tính chờ một lần nhấn phím trước khi kết thúc ứng dụng và đóng cửa sổ lại.

Console.ReadLine method là một cách để thực hiện điều đó. Thêm dòng này vào cuối mã của bạn (ngay trước câu lệnh return) sẽ khiến ứng dụng chờ bạn bấm phím trước khi thoát.

Ngoài ra, bạn có thể khởi động ứng dụng mà không cần trình gỡ lỗi kèm theo bằng cách nhấn Ctrl + F5 từ bên trong môi trường Visual Studio, nhưng điều này có những bất lợi rõ ràng ngăn cản bạn từ việc sử dụng các tính năng gỡ lỗi, mà bạn có thể muốn theo ý của bạn khi viết một ứng dụng.

Thỏa hiệp tốt nhất có thể là chỉ gọi phương thức Console.ReadLine khi gỡ lỗi ứng dụng bằng cách gói nó trong chỉ thị tiền xử lý. Một cái gì đó như:

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

Cách khác, bạn có thể sử dụng Console.ReadKey(); – PlantationGator

+40

Cá nhân, tôi thích 'if (System.Diagnostics.Debugger.IsAttached) Console.ReadLine();'. –

+3

Tại sao chạy mà không gỡ lỗi thay đổi hành vi đó? Bạn sẽ nghĩ rằng nó phải là một trải nghiệm chính xác hơn, không ít hơn. –

0

Chương trình sẽ đóng ngay sau khi quá trình thực thi hoàn tất. Trong trường hợp này, khi bạn return 0;. Đây là chức năng được mong đợi. Nếu bạn muốn xem đầu ra thì hãy chạy nó trong một thiết bị đầu cuối theo cách thủ công hoặc đặt chờ ở cuối chương trình để nó sẽ mở trong vài giây (sử dụng thư viện luồng).

6

Chương trình ngay lập tức đóng vì không có gì ngăn việc đóng. Chèn điểm ngắt tại return 0; hoặc thêm Console.Read(); trước return 0; để ngăn chương trình đóng.

3

Mã này được hoàn thành, tiếp tục bạn cần phải thêm này:

Console.ReadLine(); 

hoặc

Console.Read(); 
3

Thêm Các Read phương pháp để hiển thị đầu ra.

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

Use Console.Read(); để ngăn chương trình đóng, nhưng hãy đảm bảo bạn thêm mã Console.Read(); trước khi trả lại, nếu không thì mã sẽ không thể truy cập được.

Console.Read(); 
    return 0; 

việc kiểm tra này Console.Read

48

Thay vì sử dụng

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

bạn có thể chạy chương trình của bạn sử dụng tổ hợp phím Ctrl + F5 (nếu bạn đang ở trong Visual Studio). Sau đó, Visual Studio sẽ mở cửa sổ giao diện điều khiển, cho đến khi bạn bấm một phím.

Lưu ý: Bạn không thể gỡ lỗi mã của mình theo cách tiếp cận này.

+0

Xin chào người dùng.Tôi là một người dùng mới cho VS và C# nói chung là tốt. 'Ctrl + F5' làm gì khác mà chỉ đơn giản là' Bắt đầu' khá khác nhau? – theGreenCabbage

+0

thật không may, đôi khi nó dừng lại để làm việc như mong đợi. – MaikoID

+2

Nguyên nhân của sự cố là các cửa sổ tự động đóng cửa sổ đầu cuối khi chương trình dừng lại. Các hệ thống khác sẽ tự động mở Cửa sổ. Đây là cách tốt hơn để chạy chương trình. Không sử dụng ReadKey, Read hoặc ReadLine cho công cụ này vì điều này ngăn cản chương trình của bạn được sử dụng kết hợp với các ứng dụng giao diện điều khiển khác và đường ống. – realtime

-3

Thêm những điều sau đây trước khi trở lại 0:

system("PAUSE"); 

này in một dòng để nhấn một phím để đóng cửa sổ. Nó sẽ giữ cửa sổ cho đến khi bạn nhấn phím enter. Tôi có các sinh viên của tôi thêm nó vào tất cả các chương trình của họ.

+1

Đó có phải là C# không? –

-11

Theo quan tâm của tôi, nếu chúng tôi muốn ổn định OUTPUT OF CONSOLE APPLICATION, cho đến khi đóng màn hình đầu ra USE, nhãn: sau nhãn MainMethod và nhãn goto; trước khi kết thúc chương trình

Trong chương trình.

ví dụ:

static void Main(string[] args) 
{ 

    label: 
    ---------- 
    *****snippet of code***** 
    ----------- 

    **goto label;** 

} 
+2

Điều này sẽ chỉ khiến chương trình áp phích tiếp tục in "Hello, World!" nhiều lần – DavidPostill

3

Ngoài ra, bạn có thể trì hoãn việc đóng cửa bằng cách sử dụng đoạn mã sau:

System.Threading.Thread.Sleep(1000); 

Lưu ý Sleep đang sử dụng mili giây.

-3

nếu chương trình của bạn yêu cầu bạn nhấn enter để tiếp tục như bạn phải nhập giá trị và tiếp tục, sau đó thêm mới hoặc int và nhập ghi trước retunr (0); scanf_s ("% lf", & biến);

+1

Đây là câu hỏi ** C# **. –

-3

Để đơn giản hóa những gì người khác đang nói: Sử dụng Console.ReadKey();.

Điều này làm cho nó để chương trình được chờ đợi vào người dùng nhấn một phím thông thường trên bàn phím

Nguồn: tôi sử dụng nó trong các chương trình của tôi cho giao diện điều khiển các ứng dụng.

8

này hoạt động tương tự cho CtrlF5 hay F5. Đặt ngay trước khi kết thúc phương thức Main.

+2

Chỉ cần lưu ý, dòng cuối cùng sẽ là 'Console.ReadKey()' cho bất kỳ khóa nào, 'Console.ReadLine()' đợi nhập vào được nhấn – Chris

4

Một cách khác là sử dụng Debugger.Break() trước khi trở về từ phương thức Main

+0

Mặc dù các công tắc này tập trung trở lại cửa sổ trình gỡ rối và có khả năng ẩn nội dung của cửa sổ giao diện điều khiển. –

-3

tôi luôn luôn thêm lệnh sau để một ứng dụng console.(Tạo đoạn mã cho điều này nếu bạn muốn)

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

Thực hiện điều này giúp khi bạn muốn thử nghiệm các khái niệm khác nhau thông qua giao diện điều khiển.

Ctr + F5 sẽ đặt Console ở lại nhưng bạn không thể gỡ lỗi! Tất cả các ứng dụng giao diện điều khiển mà tôi đã viết trong thế giới thực luôn không tương tác và được kích hoạt bởi một Trình lập lịch biểu như TWS hoặc trạm CA Work và không yêu cầu một cái gì đó như thế này.

3

Tôi giả sử lý do bạn không muốn đóng trong chế độ gỡ lỗi, là vì bạn muốn xem xét giá trị của các biến v.v. Vì vậy, tốt nhất nên chỉ cần chèn điểm ngắt khi đóng "}" của hàm chính. Nếu bạn không cần gỡ lỗi, thì Ctrl-F5 là tùy chọn tốt nhất.

+0

Ngạc nhiên không có câu trả lời nào khác đề xuất điều này. Thật hiếm khi có câu trả lời với tùy chọn mới được thêm vào quá muộn sau khi câu hỏi được tạo. –

-3

Bạn có thể giải quyết nó theo cách rất đơn giản chỉ cần gọi đầu vào. Tuy nhiên, nếu bạn nhấn Enter thì bảng điều khiển sẽ không còn nữa. Đơn giản chỉ cần sử dụng này Console.ReadLine(); hoặc Console.Read();

0

Nếu bạn muốn giữ lại các ứng dụng mở ra, bạn không thể làm gì mà giữ quá trình sống, vì vậy nhìn vào mã bên dưới:

while (true); 

Đây là cách đơn giản nhất để đạt được hành vi mong đợi, nhưng nó làm rò rỉ CPU, do đó buộc phải lặp lại vô hạn.

Tại thời điểm này, bạn có thể chọn để sử dụng System.Windows.Forms.Application (nhưng nó đòi hỏi thêm System.Windows.Forms tham khảo):

Application.Run(); 

này không rò rỉ CPU và làm việc thành công.

Để tránh thêm System.Windows.Forms tham khảo bạn có thể sử dụng một thủ thuật đơn giản, nhập khẩu System.Threading:

SpinWait.SpinUntil(() => false); 

này cũng hoạt động hoàn hảo, và nó tinh thần bao gồm trong một iterator while với một điều kiện phủ nhận đó là được trả về bởi các lambda trên phương pháp. Nhưng nó không rò rỉ CPU! Tại sao? Bạn có thể nhìn vào mã nguồn here, nhưng về cơ bản, spin đang chờ chủ đề hiện tại.

Bạn cũng có thể chọn để tạo một looper thông điệp rằng peeks các thư đang chờ xử và xử lý mỗi trong số họ trước khi chuyển cho phiên bản kế tiếp:

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

Sau đó, bạn có thể lặp một cách an toàn bằng cách làm một cái gì đó như thế này:

while (true) 
    ProcessMessageOnce(); 

Bạn cũng có thể làm điều này tốt hơn bằng cách thay thế while iterator với một invocation SpinWait.SpinUntil:

SpinWait.SpinUntil(ProcessMessageOnce); 
Các vấn đề liên quan