logo

Thông báo

Icon
Error

Chia sẻ
Tùy chọn
Xem
Xem bài viết cuối
Offline admin  
#1 Đã gửi : 17/06/2015 lúc 12:37:37(UTC)
admin

Danh hiệu: Administration

Chức danh:

Nhóm: Administrators
Gia nhập: 23-07-2013(UTC)
Bài viết: 6,117
Man
Viet Nam
Đến từ: Vietnam

Cảm ơn: 10 lần
Được cảm ơn: 2 lần trong 2 bài viết

BackgroundWorker là một component (nằm trong namespace System.ComponentModel) giúp cho việc lập trình Thread trở nên dễ dàng do các thuộc tính và event mà nó hỗ trợ sẵn. Lớp này được .NET cung cấp với mục đích quản lý các tiến trình chạy nền, ít hao tốn tài nguyên nhất.

Bài viết này sẽ giới thiệu cách sử dụng BackgroundWoker để làm một ví dụ tính tổng 2 số sử dụng progress bar theo kiểu gọi bất đồng bộ.

Lớp BackgroundWorker có những thuộc tính quan trọng sau :

  1. WorkerReportsProgress: cho phép tiến trình báo cáo tiến độ của công việc (nếu là true)
  2. WorkerSupportsCancellation: cho phép dừng tiến trình trong khi đang thực thi (nếu là true)
  3. CancellationPending: cờ báo dừng tiến trình (= true nghĩa là có lệnh dừng tiến trình)

Lớp BackgroundWorker được quảnthông qua 3 sự kiện chính:

  1. DoWork: đoạnthực hiện công việc sẽ được đặt ở đây. Sự kiện này xảy ra khi bắt đầu tiến trình.
  2. ProgressChanged: xảy ra khi tiến độ của tiến trình có sự thay đổi hoặc khi ta gọi hàm ReportProgress() của lớp BackgroundWorker.
  3. RunWorkerCompleted: xảy ra khi tiến trình hoàn tất hoặc bị hủy bỏ.

Để sử dụng BackgroundWorker trong Windows Form, bạn có thể kéo component vào từ Toolbox trong thẻ Components và sử dụng như các control thông thường.

Ví dụ: Tính tổng của 2 số, dùng lớp BackgroundWorker để quảnviệc chạy một vòng lặp và hiển thị tiến độ lên thanh ProgressBar..

Screen shot

1. Thiết kế Form

2. Demo

C# source code: 

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
USING System;
USING System.Collections.Generic;
USING System.ComponentModel;
USING System.Data;
USING System.Drawing;
USING System.Linq;
USING System.Text;
USING System.Windows.Forms;
USING System.Threading;
 
NAMESPACE BgWorker_demo
{
    PUBLIC PARTIAL CLASS Form1 : Form
    {
        PUBLIC Form1()
        {
            InitializeComponent();
         }
 
        PUBLIC VOID display(STRING thongbao)
        {
            MessageBox.Show(thongbao);
        }
       
        PRIVATE VOID bgWorker1_DoWork(OBJECT sender, DoWorkEventArgs e)
        {
            FOR (INT i = 1; i <= 100; i++)
            {
                IF (bgWorker1.CancellationPending)
                {
                    e.Cancel = TRUE;
                }
                ELSE
                {
                    async();
                    bgWorker1.ReportProgress(i);
                }
                 
            }
 
        }
 
        PRIVATE VOID button1_Click(OBJECT sender, EventArgs e)
        {
            bgWorker1.RunWorkerAsync();
        }
 
        PRIVATE VOID btnCancel_Click(OBJECT sender, EventArgs e)
        {
            bgWorker1.CancelAsync();
        }
 
        PRIVATE VOID bgWorker1_ProgressChanged(OBJECT sender, ProgressChangedEventArgs e)
        {
             
            progressBar1.Value = e.ProgressPercentage;
            lbl1.Text = e.ProgressPercentage.ToString() + " % completed";
        }
 
        PRIVATE VOID bgWorker1_RunWorkerCompleted(OBJECT sender, RunWorkerCompletedEventArgs e)
        {
            IF (e.Cancelled)
            {
                display("The program is stopped");
            }
            ELSE
            {
                TRY
                {
                    DOUBLE a = Convert.ToDouble(textBox1.Text);
                    DOUBLE b = Convert.ToDouble(textBox2.Text);
                    DOUBLE c = a + b;
                    textBox3.Text = Convert.ToString(c);
                    display("Already completed");
                }
                CATCH (Exception ex)
                {
                    THROW ex;
                }
            }
        }
        PUBLIC VOID async()
        {
            Thread.Sleep(100);
        }
    }
}

Ai đang xem chủ đề này?
OceanSpiders 2.0
Di chuyển  
Bạn không thể tạo chủ đề mới trong diễn đàn này.
Bạn không thể trả lời chủ đề trong diễn đàn này.
Bạn không thể xóa bài của bạn trong diễn đàn này.
Bạn không thể sửa bài của bạn trong diễn đàn này.
Bạn không thể tạo bình chọn trong diễn đàn này.
Bạn không thể bỏ phiếu bình chọn trong diễn đàn này.

| Cung cấp bởi YAF.NET 2.2.4.14 | YAF.NET © 2003-2021, Yet Another Forum.NET
Thời gian xử lý trang này hết 3.209 giây.