2013-02-06 56 views
8

Bắt đầu một ứng dụng giao diện điều khiển mới sử dụng đoạn mã sau -Tại sao khối Console.In.ReadLineAsync?

class Program 
{ 
    static void Main(string[] args) 
    { 
     while (true) 
     { 
      Task<string> readLineTask = Console.In.ReadLineAsync(); 

      Debug.WriteLine("hi"); 
     } 
    } 
} 

Console.In.ReadLineAsync chặn và không trả lại cho đến khi một dòng được nhập vào giao diện điều khiển .. như vậy "Hi" không bao giờ được ghi vào giao diện điều khiển.

Sử dụng chờ đợi trên Console.In.ReadLineAsync cũng chặn.

Tôi hiểu rằng các phương pháp Async CTP mới không chặn.

Lý do cho việc này là gì?


Dưới đây là một ví dụ

static void Main(string[] args) 
{ 
    Task delayTask = Task.Delay(50000); 

    Debug.WriteLine("hi"); 
} 

này hoạt động như tôi mong đợi, nó đi thẳng đến dòng kế tiếp và in "hi" vì Task.Delay không chặn.

Trả lời

5

daryal cung cấp câu trả lời ở đây http://smellegantcode.wordpress.com/2012/08/28/a-boring-discovery/

Dường ReadLineAsync không thực sự làm những gì nó phải làm. Lỗi trong khuôn khổ.

Giải pháp của tôi là sử dụng ThreadPool.QueueUserWorkItem trong một vòng lặp để mỗi cuộc gọi đến ReadLineAsync được thực hiện trên một chuỗi mới.

+3

Bug được báo cáo ở đây https://connect.microsoft.com/VisualStudio/feedback/details/779079/console-readlineasync-is-actually-blocking-when-it-should-be-returning-a-task -ngay – NoPyGod

2

này bây giờ có thể được tìm thấy trong the documentation:

đọc hoạt động trên dòng đầu vào tiêu chuẩn thực hiện đồng bộ. Tức là, họ chặn cho đến khi hoạt động đọc được chỉ định đã hoàn thành. Điều này đúng ngay cả khi một phương thức không đồng bộ, chẳng hạn như ReadLineAsync, được gọi trên đối tượng TextReader được trả về bởi thuộc tính In.

Các vấn đề liên quan