C # Winforms: BeginInvoke все еще работает в том же потоке? - PullRequest
1 голос
/ 24 мая 2011

Я веб-разработчик и пытаюсь войти в многопоточное программирование. В одной форме я пытаюсь запустить метод вычисления значений во втором потоке с использованием асинхронных делегатов. Я также хочу, чтобы индикатор выполнения отображал фактический прогресс в потоке пользовательского интерфейса.

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);
}

Когда я запускаю это, все вычисляется без каких-либо проблем, за исключением того, что оно все еще выполняется в потоке пользовательского интерфейса (я так полагаю, потому что оно зависает, когда я нажимаю какую-то кнопку в форме).

Почему? Я также прилагаю примерный проект (VS2010) с тем же кодом: http://osmera.com/windowsformsapplication1.zip

Спасибо за помощь новичку.

1 Ответ

4 голосов
/ 24 мая 2011

В коде, который вы показали, вы ничего не делаете, кроме обновления индикатора выполнения - так что есть тысячи сообщений пользовательского интерфейса для маршала, но ничего не происходит в потоке без пользовательского интерфейса.

Если вы начнете имитировать реальную работу в Compute, вы увидите, что она будет вести себя более разумно, я подозреваю. Вам нужно убедиться, что вы не завалили поток пользовательского интерфейса обновлениями прогресса, как вы делаете сейчас.

...