using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace ProgressBar
{
public partial class Form1 : Form
{
private delegate void Async();
private void Progress()
{
pictureBox1.Invoke(new MethodInvoker(delegate { pictureBox1.Visible = true; }));
for (float i = 0; i < 30000; i++)
{
progressBar1.Invoke(new MethodInvoker(delegate { progressBar1.Value = (int)i; }));
}
pictureBox1.Invoke(new MethodInvoker(delegate { pictureBox1.Visible = false; }));
}
public Form1()
{
InitializeComponent();
}
private void btnEnter_Click(object sender, EventArgs e)
{
try
{
progressBar1.Value = Convert.ToInt32(textBox1.Text);
}
catch (Exception)
{
MessageBox.Show("При выполнении преобразования типов возникла ошибка");
return;
}
}
private void btnStart_Click(object sender, EventArgs e)
{
Async prdelegate = new Async(Progress);
AsyncCallback cb = new AsyncCallback(CallBackMethod);
prdelegate.BeginInvoke(cb, prdelegate);
}
private void CallBackMethod(IAsyncResult ar)
{
Async prdelegate = (Async)ar.AsyncState;
prdelegate.EndInvoke(ar);
}
}
}
ProgressBar, BeginInvoke, асинхронный метод
Окно во время заполнения прогрессбара не реагирует на действия пользователя, хотя вроде заполнение происходит в асинхронном методе.
и кстати почему ты используешь float, а не int в цикле for?
Progress()
а когда прогрессбар заполнился, то все нормально дальше работает...
P.S. повторюсь: у меня вообще не виснет. попробуй запустить без отладки.
Получается так, что форма реагирует на нажатия, перетаскивания раз через три. Видимо из-за того, что система нагружается. ПРОЦ - 100%!!!
Код:
private void Progress()
{
pictureBox1.Invoke(new MethodInvoker(delegate { pictureBox1.Visible = true; }));
for (int i = 0; i < 30000; i++)
{
if(i%1000 == 0) progressBar1.Invoke(new MethodInvoker(delegate { progressBar1.Value = i; }));
Application.DoEvents();
}
pictureBox1.Invoke(new MethodInvoker(delegate { pictureBox1.Visible = false; }));
}
{
pictureBox1.Invoke(new MethodInvoker(delegate { pictureBox1.Visible = true; }));
for (int i = 0; i < 30000; i++)
{
if(i%1000 == 0) progressBar1.Invoke(new MethodInvoker(delegate { progressBar1.Value = i; }));
Application.DoEvents();
}
pictureBox1.Invoke(new MethodInvoker(delegate { pictureBox1.Visible = false; }));
}
Необязательно обращаться к форме и менять значение прогрессбара через каждое инкрементирование, ведь это же не критично для пользователя.