2010-01-19 31 views
5

Bạn có giải pháp tốt để giữ biểu tượng 'Vui lòng đợi' được 'vẽ' trong khi ứng dụng đang thực hiện tác vụ dài không?Bản cập nhật Winform về các tác vụ chạy dài

Tôi đã thử sử dụng form.refresh() trên mỗi bước, nhưng có một vài truy vấn chạy dài diễn ra, có nghĩa là điều này không đủ thường xuyên.

Về cơ bản, số này là SO Question nhưng, trên C# trong Excel qua VSTO (chứ không phải là Python).

+0

Đây có phải là thực sự web hình thức, hoặc là winforms này? Bạn đang nói về Excel và VSTO. và nếu đó là biểu mẫu web, bạn không có phương thức làm mới. –

+0

Xin lỗi, vâng, Winforms, không phải Webforms .. Đã chỉnh sửa câu hỏi ... Đã là một ngày dài ... –

+0

Bất kỳ giải pháp cuối cùng nào có mẫu mã nguồn đầy đủ? Điều gì về việc sử dụng quá trình chạy dài với các bước sử dụng C#, SignalR? – Kiquenet

Trả lời

1

Here's a good example bằng mã trong C#.

Nó dành cho màn hình giật gân cụ thể, tuy nhiên nó gần như là quá trình giống hệt nhau (có thể trừ đi một số Opacity hào nhoáng) để tạo cửa sổ Vui lòng đợi.

Thông tin chính là bạn sẽ cần một chuỗi riêng biệt. Điều này có thể làm phức tạp mọi thứ tuy nhiên bài viết đưa ra một phạm vi bảo hiểm tốt/ví dụ về làm thế nào để làm điều đó một cách chính xác.

+0

Cảm ơn bạn đã liên kết này. Hoạt động thực sự tốt, và tích hợp vào ứng dụng Excel VSTO của tôi thực sự độc đáo! –

1

Sử dụng BackgroundWorker

+0

Người đàn ông tôi mệt mỏi - Tôi nghĩ rằng đây là chiến thắng. Câu trả lời nên được sử dụng AJAX (MS AJAX sẽ hoạt động tốt). Bạn có thể sử dụng điều khiển Bộ hẹn giờ để kiểm tra trạng thái. Sau đó, bạn có thể chuyển hướng khi hoàn thành. – hackerhasid

+0

Liên kết MSDN: http://msdn.microsoft.com/en-us/magazine/cc164051.aspx – hackerhasid

+0

Xin lỗi vì câu hỏi, câu hỏi đã được thay đổi từ biểu mẫu web => winforms. –

0

Một tùy chọn khác là sử dụng một đại biểu không đồng bộ để hiển thị biểu mẫu trên chuỗi threadpool.

Chủ đề trong threadpool được đề nghị cho các chủ đề sống ngắn hơn không kéo dài trong toàn bộ thời gian đăng ký. Vì đây là để hiển thị một thời gian ngắn xin vui lòng chờ đợi cửa sổ, các threadpool là một sự lựa chọn hợp lý.

Hành động ủy nhiệm (.NET 2.0+) được sử dụng cùng với phương thức BeginInvoke() của nó để tự động chạy mã đại biểu trên một luồng threadpool.

Một số lưu ý:

  • Điều quan trọng là sử dụng Control.BeginInvoke cho bất kỳ chủ đề cuộc gọi GUI chéo, chẳng hạn như đóng cửa các hình thức vui lòng đợi trong ClosePleaseWait().
  • Ngoài ra, m_pleaseWaitForm.ShowDialog(); thực sự bắt đầu một vòng lặp tin nhắn mới trong chuỗi mới. Đây là những gì giữ cho hình thức chờ đợi vui vẻ.
  • Bởi vì một thread threadpool được sử dụng, chủ đề này sẽ tự động là một chủ đề nền và sẽ bị chấm dứt nếu ứng dụng chính được đóng lại.
  • Ngoài việc chạy trên một chuỗi khác, không có gì đặc biệt về Form2. Bạn có thể đặt bất kỳ điều khiển con nào như Pictureboxes, nhãn vv trên đó.
  • (MethodInvoker)delegate { ... } chỉ là cách chạy .NET 2.0 trong nội dòng đại biểu.

Ví dụ dưới đây có thể được thêm vào dự án WinForms có chứa Form1: biểu mẫu chính và Biểu mẫu 2: biểu mẫu xin vui lòng chờ.

private Form2 m_pleaseWaitForm = null; 

    private void Form1_Shown(object sender, EventArgs e) 
    { 
     // This code could also be placed in eg. a button click event handler. 

     Action<Rectangle> a = new Action<Rectangle>(ShowPleaseWait); 

     a.BeginInvoke(this.Bounds, null, null); 

     // Do your long running tasks 

     ClosePleaseWait(); 
    } 


    private void ShowPleaseWait(Rectangle bounds) 
    { 
     // This method runs on the new thread. 

     m_pleaseWaitForm = new Form2(); 

     m_pleaseWaitForm.TopMost = true; 
     m_pleaseWaitForm.Location = new Point(bounds.Left + bounds.Width/2 - m_pleaseWaitForm.Width/2, bounds.Top + bounds.Height/2 - m_pleaseWaitForm.Height/2); 

     m_pleaseWaitForm.ShowDialog(); 

    } 

    private void ClosePleaseWait() 
    { 
     m_pleaseWaitForm.BeginInvoke((MethodInvoker)delegate { m_pleaseWaitForm.Close(); }); 
    } 
3

Như statichippo đã đề cập, tôi sẽ sử dụng Lớp nền tảng. Mục đích của nó là đơn giản hóa đa luồng và cho phép một chuỗi công nhân thực hiện xử lý tốn thời gian mà không khóa GUI.

Dưới đây là một trích dẫn từ MSDN:

Lớp BackgroundWorker cho phép bạn để chạy một hoạt động trên, thread chuyên dụng riêng biệt.Các hoạt động tốn thời gian như tải xuống và cơ sở dữ liệu các giao dịch có thể khiến người dùng của bạn giao diện (Giao diện người dùng) có vẻ như là đã ngừng phản hồi trong khi đang chạy . Khi bạn muốn có giao diện người dùng đáp ứng và bạn phải đối mặt với sự chậm trễ kéo dài được kết hợp với các hoạt động như vậy, lớp học Lớp nền tảng cung cấp giải pháp tiện lợi .

Đây là một hướng dẫn tốt làm thế nào để sử dụng lớp BackgroundWorker trong cửa sổ hình thức: Implementing multi-threading in WinForms using the BackgroundWorker class

Có nhiều cách phức tạp hơn để thực hiện Multi-Threading trong C# cho các kịch bản phức tạp nhưng đối với các tình huống đơn giản nhất BackgroundWorker hoạt động tuyệt vời (Cho tôi ít nhất).

Dưới đây là một số liên kết Tôi kéo từ Google trên C# nhiều Threading:
MSDN Threading
Introduction to Multithreading in C#

+0

bất kỳ mẫu mã nguồn đầy đủ nào? – Kiquenet

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