Bạn có thể sử dụng BackgroundWorker cho các yêu cầu như vậy. Dưới đây là một mẫu mà updates a label status based on percentage task [long running] completion
. Ngoài ra, có một lớp nghiệp vụ mẫu đặt một số giá trị và giá trị được đặt trở lại giao diện người dùng thông qua trình xử lý ProgressChanged
. DoWork
là nơi bạn viết logic nhiệm vụ chạy dài của mình. Sao chép-Dán mã dưới đây sau khi thêm một nhãn và thành phần nền tảng trên một ứng dụng Winforms & cho nó một shot. Bạn có thể gỡ lỗi trên các trình xử lý khác nhau [RunWorkerCompleted, ProgressChanged, DoWork]
và xem phương thức InitWorker
. Hãy chú ý đến số cancellation feature
.
using System.ComponentModel;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form3 : Form
{
private BackgroundWorker _worker;
BusinessClass _biz = new BusinessClass();
public Form3()
{
InitializeComponent();
InitWorker();
}
private void InitWorker()
{
if (_worker != null)
{
_worker.Dispose();
}
_worker = new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true
};
_worker.DoWork += DoWork;
_worker.RunWorkerCompleted += RunWorkerCompleted;
_worker.ProgressChanged += ProgressChanged;
_worker.RunWorkerAsync();
}
void DoWork(object sender, DoWorkEventArgs e)
{
int highestPercentageReached = 0;
if (_worker.CancellationPending)
{
e.Cancel = true;
}
else
{
double i = 0.0d;
int junk = 0;
for (i = 0; i <= 199990000; i++)
{
int result = _biz.MyFunction(junk);
junk++;
// Report progress as a percentage of the total task.
var percentComplete = (int)(i/199990000 * 100);
if (percentComplete > highestPercentageReached)
{
highestPercentageReached = percentComplete;
// note I can pass the business class result also and display the same in the LABEL
_worker.ReportProgress(percentComplete, result);
_worker.CancelAsync();
}
}
}
}
void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
// Display some message to the user that task has been
// cancelled
}
else if (e.Error != null)
{
// Do something with the error
}
}
void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
label1.Text = string.Format("Result {0}: Percent {1}",e.UserState, e.ProgressPercentage);
}
}
public class BusinessClass
{
public int MyFunction(int input)
{
return input+10;
}
}
}
Nguồn
2012-07-16 09:03:21
Tôi sẽ sử dụng nền tảng. – Tomtom
Nếu bạn chỉ cần một chủ đề khác, tôi sẽ sử dụng một nhân viên nền, chúng rất dễ sử dụng và hầu hết công việc khó khăn đã được thực hiện, cung cấp cho bạn các sự kiện thẳng về phía trước cho các giai đoạn hoàn thành công việc khác nhau. – ThePower
Bạn có ý nghĩa gì khi sử dụng lại? –