C#Winforms:BeginInvoke仍然在同一个线程上运行?

时间:2011-05-24 12:43:12

标签: winforms multithreading begininvoke

我是网络开发人员,我正试图进入多线程编程。 在一种形式上,我试图运行一个方法,使用异步委托计算第二个线程中的值。 我还想要一个进度条,显示UI线程的实际进度已被通知。

delegate void ShowProgressDelegate(int total, int value);  
delegate void ComputeDelegate(int value);

//Some method simulating sophisticated computing process
private void Compute(int value)
{
    ShowProgress(value, 0);
    for (int i = 0; i <= value; i++)
    {
        ShowProgress(value, i);
    }
} 

//Method returning values into UI thread
private void ShowProgress(int total, int value)
{
    if (!this.InvokeRequired)
    {
        ComputeButton.Text = value.ToString();
        ProgressBar.Maximum = total;
        ProgressBar.Value = value;
    }
    else
    {
        ShowProgressDelegate showDel = new ShowProgressDelegate(ShowProgress);
        this.BeginInvoke(showDel, new object[] { total, value });
    }
} 


//firing all process
private void ComputeButton_Click(object sender, EventArgs e)
{
    ComputeButton.Text = "0";
    ComputeDelegate compDel = new ComputeDelegate(Compute);
    compDel.BeginInvoke(100000, null, null);
}

当我运行它时,一切都是计算没有任何问题,除了它仍然在UI线程中运行(我想是这样,因为当我点击表单上的某个按钮时它会冻结)。

为什么呢?我还附加了可构建的示例项目(VS2010),代码相同:http://osmera.com/windowsformsapplication1.zip

感谢帮助neewbie。

1 个答案:

答案 0 :(得分:4)

在您显示的代码中,除了更新进度条之外,您什么都不做 - 因此有数千条UI消息要编组,但非UI线程中没有发生任何重大事件。

如果你开始在Compute中模拟真正的工作,我会怀疑你会看到它的行为更合理。您需要确保不要像现在这样使用进度更新来淹没UI线程。