Hiển thị kết quả từ 1 đến 5 / 5
  1. #1
    Tham gia
    02-06-2008
    Bài viết
    102
    Like
    0
    Thanked 1 Time in 1 Post

    Việc sử dụng BackGroundWorker

    Mình có sử dụng backgroundworker. Trong chương trình có một button tên là stop, khi click vào stop thì sẽ hỏi có chắc chắn muốn dừng xử lý hay không? vấn đề là trong khi cái Messagebox này hiện lên thì worker vẫn làm việc bình thường. Mình muốn là khi cái Messagebox này hiện lên thì worker sẽ tạm dừng làm việc, nếu click yes thì dừng làm việc còn click no thì worker lại tiếp tục làm việc...
    Thanks các bạn
    Quote Quote

  2. #2
    Tham gia
    19-06-2007
    Bài viết
    136
    Like
    0
    Thanked 0 Times in 0 Posts
    backgroundworker là gì bạn?
    sao bạn không nói thread cho dể?
    Bạn muốn pause cái chi đó, thông thường dùng vòng lặp while

    while(ObjectState != State.Paused)
    {
    // do something
    }

    kh bấm button ->
    ObjectState = State.Paused;
    if(MessageBox.Show("Are you sure you want to stop?", MessageBoxIcon.Confirm, MessageBoxButton.YesNo) != DialogResult.Yes)
    {
    ObjectState = State.Running;
    return;
    }
    ObjectState = State.Stop;


    trong chương trình khai enum
    private enum State
    {
    Running,
    Paused,
    Stop,
    }

  3. #3
    Tham gia
    20-08-2006
    Bài viết
    510
    Like
    0
    Thanked 1 Time in 1 Post
    thấy câu hỏi cũng có lý nên acx cũng đọc sơ qua về backgroundworker và thử như vầy, cũng chưa nắm rõ cái này lắm, nhưng mà acx ko thấy cái nào đề dừng cái backgroundworker này ngoại trừ việc tạm dừng (như yêu cầu) và giải phóng nó luôn

    Code:
            BackgroundWorker bw = new BackgroundWorker();
    
            void bw_Disposed(object sender, EventArgs e)
            {
                this.Text = "Disposed";
            }
    
            void bw_DoWork(object sender, DoWorkEventArgs e)
            {
                BackgroundWorker bwAsync = sender as BackgroundWorker;
                if (bwAsync.CancellationPending)
                {
                    Thread.Sleep(1000);
                    e.Cancel = true;
                    return;
                }
            }
    
            void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                if (e.Error != null) { this.Text = e.Error.Message; return; }
            }
            BackgroundWorker bw;
    
            private void button1_Click(object sender, EventArgs e)
            {
                if(bw==null)
                {
                    bw= new BackgroundWorker();
                    bw.WorkerReportsProgress = true;
                    bw.WorkerSupportsCancellation = true;
                    bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
                    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
                    bw.DoWork += new DoWorkEventHandler(bw_DoWork);
                    bw.Disposed += new EventHandler(bw_Disposed);
                }
                 
                bw.CancelAsync();
                IsRunning(bw);
    
                if (MessageBox.Show("Stop?","Stop???",MessageBoxButtons.YesNo) != DialogResult.Yes)
                {
                    bw.RunWorkerAsync();
                    IsRunning(bw);
                }
                else
                {
                    bw.Dispose();
                }
            }
    
            void IsRunning(BackgroundWorker b)
            {
                if (b != null && b.IsBusy) { this.Text = "Running";}
                else { this.Text = "Free";}
            }

  4. #4
    Tham gia
    02-06-2008
    Bài viết
    102
    Like
    0
    Thanked 1 Time in 1 Post
    Quote Được gửi bởi aochoangxanh View Post
    thấy câu hỏi cũng có lý nên acx cũng đọc sơ qua về backgroundworker và thử như vầy, cũng chưa nắm rõ cái này lắm, nhưng mà acx ko thấy cái nào đề dừng cái backgroundworker này ngoại trừ việc tạm dừng (như yêu cầu) và giải phóng nó luôn
    acx ơi. em thấy nó chỉ có cho dừng hẳn thôi chứ có tạm dừng đâu.
    nếu làm như của anh thì là giải phóng nó luôn, tức là dừng hẳn. còn em chỉ muốn cho nó tạm dừng trong khoảng thời gian mà cái MessageBox hiện lên chờ mọi người Confirm. (

  5. #5
    Tham gia
    20-08-2006
    Bài viết
    510
    Like
    0
    Thanked 1 Time in 1 Post
    acx có thử lại thì thấy cái backgroundworker này có 2 cái 1 là cancel, 2 là Run, thử chế biến thêm 1 cái gì đó để lưu giữ thông tin cái tiến trình hiện thời coi sao, đại khái nó như vầy:
    - Run bw
    - Cancel bw khi hiện msgbox
    - xuất hiện lựa chọn (tiếp tục và không tiếp tục nữa) - chỉ nói về tiếp tục
    + lưu giữ mấy cái thông tin hiện tại
    + gọi 1 cái gì đó có thể truyền giá trị được lưu lại để tiếp tục

    ---------------------
    mới search thì thấy có cái này http://social.msdn.microsoft.com/For...8-c122e152daa8
    Được sửa bởi aochoangxanh lúc 14:02 ngày 03-01-2010

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •