2013-07-04 50 views
0

我有以下代码以异步方式更新进度栏,我注意到 它通过调用MessageBox的异步行为。在这种情况下,它完美地工作 ,但是当我给睡眠1s(1000) MessageBox不会弹出,并且完整的进度条一次填充。 请告诉您为什么会发生这种情况。异步行为

private void button1_Click(object sender, EventArgs e) 
    { 
     Update_Async async = new Update_Async(Update_Async_method); 
     progressBar1.BeginInvoke(async,10); 
     MessageBox.Show("Updation In Progress"); 


    } 

    public void Update_Async_method(int a) 
    { 
     this.progressBar1.Maximum = a; 
     for (int i = 1; i <= a; i++) 
     { 
      progressBar1.Value = a; 
      Thread.Sleep(10); 

    //Thread.Sleep(1000); 

     } 
    } 
+0

尝试'progressBar1.value =我'不是一个。如果将其设置为a,则将其设置为完成。 – Codeguy007

+0

那么,哪个位异步发生,即在另一个线程上?当您在控件上调用'BeginInvoke'时,将在主GUI线程上调用代码。主GUI线程是'Click'事件处理程序已经运行的地方。因此,没有异步性。 – Jodrell

+0

那么,为什么我们有BeginInvoke On Controls.Please精心制作 – user1512186

回答

0

尝试Update_Async.BeginInvoke(async, 10)代替,如果你想委托给asynchrnously运行,但你必须横线上的更新进度条检查。


在回答您的意见,非常类似于你在做什么已经,

void UpdatingFunction(int value) 
{ 
    if (this.progressBar.InvokeRequired) 
    { 
     this.progressBar.BeginInvoke(UpdatingFunction, value); 
     return; 
    } 

    // Invoke not required, work on progressbar. 
} 

这也解释了关于控制Invoke方法对。

+0

我该如何检查?请详述 – user1512186

+0

谢谢,现在清晰 – user1512186

0

Delegate.BeginInvoke将在一个线程中运行一次方法,然后处理它。如果你想在一个线程中重复做一些工作并返回中间结果,这是一个糟糕的选择。如果这是你想要的,你应该使用BackgroundWorker。高度缩写片段:

BackgroundWorker bw; 

YourFormConstructor() 
{ 
    ... 
    bw = new BackgroundWorker(); 
    bw.WorkerReportsProgress = true; 
    bw.DoWork += BackgroundCalculations; 
    bw.ProgressChanged += ShowBackgroundProgress; 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    bw.RunWorkerAsync(10); 
} 

void ShowBackgroundProgress(object sender, ProgressChangedEventArgs e) 
{ 
    this.progressBar.Value = e.ProgressPercentage; 
} 

static void BackgroundCalculations(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker bw = sender as BackgroundWorker; 

    int max = (int)e.Argument; 
    for (int i = 0; i < max; i++) 
    { 
     bw.ReportProgress(i * 100/max); 
     Thread.Sleep(10); 
    } 

    bw.ReportProgress(100); 
    } 
}