2010-03-27 28 views
5

Tôi có một quy trình, kết quả đầu ra từng bước (ví dụ: mục Xử lý 1 ... Lỗi trong mục 2 v.v.).Làm cách nào để cập nhật thông báo tiến trình trong khi xử lý dữ liệu trong ASP.NET?

Tôi muốn điều này được xuất ra cho người dùng trong quá trình chứ không phải ở cuối.

Tôi khá chắc chắn mình cần thực hiện điều này với luồng, nhưng không thể tìm thấy ví dụ phù hợp.

Trả lời

6

Đây không phải là vấn đề về luồng, mà là sự cố giao diện người dùng trình duyệt web. Bạn muốn trình duyệt hiển thị trạng thái khi bạn đang thực hiện công việc trên máy chủ. Về lý thuyết, bạn có thể làm điều gì đó như:

Response.Write("something"); 
Response.Flush(); 

nhưng không đảm bảo trình duyệt thực sự hiển thị mã của bạn tại thời điểm đó. Trong thực tế, bạn không thể kiểm soát cách dữ liệu được lưu trữ/chunked/đệm được tiến hành từ máy chủ đến trình duyệt. Vì vậy, mỗi bản cập nhật phải là giao dịch http 'đầy đủ'.

Một cách và phổ biến nhất là sử dụng AJAX để đạt được điều này. Người dùng nhấp vào một nút bắt đầu một số công việc nền và bạn có bộ đếm thời gian javascript mà cuộc thăm dò ý kiến ​​(yêu cầu) để kiểm tra trạng thái công việc và cập nhật trình duyệt của khách hàng.

Kiểm tra Real-Time Progress Bar With ASP.NET AJAX để thực hiện chỉ báo tiến trình ajax với ajax và .net.

Có một ví dụ tuyệt vời của việc tạo ra một thanh tiến trình với một handler http trong bài viết này: http://www.asp101.com/articles/matt/progressbar/default.asp

Để chứng minh quan điểm của tôi, đoạn code sau làm việc trong Firefox, nhưng không phải trong IE hay Chrome:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Buffer = false; 
    Response.Clear(); 
    Response.Write("<html><body>"); 
    Response.Write("1\n"); 
    Response.Flush(); 
    Thread.Sleep(2000); 
    Response.Write("1\n"); 
    Response.Flush(); 
    Thread.Sleep(2000); 
    Response.Write("1\n"); 
    Response.Flush(); 
    Thread.Sleep(2000); 
    Response.Write("1\n"); 
    Response.Flush(); 
    Response.Write("</body></html>"); 
    Response.End(); 
} 
+0

Tôi đã nhìn thấy một cách thực sự gọn gàng sử dụng các chủ đề trước đây ... Chỉ cần không thể nhớ nơi, và làm thế nào để làm điều đó. Về cơ bản nó bắt đầu một phương thức đang chạy, và thường xuyên như vậy, thông báo tiến độ tiếp theo được hiển thị – Danny

+0

Công việc của bạn sẽ thực thi trên một luồng cập nhật trạng thái tiến trình của nó. Sau đó, khách hàng của bạn sẽ thăm dò ý kiến ​​của tiểu bang. Nhưng như tôi đã đề cập, bạn có thể thuyết phục công việc trong một chủ đề và viết tiến trình với Response.Write và Response.Flush, nhưng bạn không được đảm bảo rằng nó thực sự được chuyển sang trình duyệt và hiển thị trước khi toàn bộ yêu cầu kết thúc. –

+0

Tôi không nghĩ rằng Response.Write hoạt động trong một chủ đề. Tuy nhiên, một cái gì đó đang trở lại tại mục tôi đã thấy trước đây, và tôi nghĩ rằng nó có thể đã sử dụng AJAX để bơi bên phía khách hàng trạng thái. – Danny

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