Я веб-разработчик и пытаюсь войти в многопоточное программирование.
В одной форме я пытаюсь запустить метод вычисления значений во втором потоке с использованием асинхронных делегатов.
Я также хочу, чтобы индикатор выполнения отображал фактический прогресс в потоке пользовательского интерфейса.
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
Спасибо за помощь новичку.