Как исключить повторное выполнение кода
Такая вот проблема. (С#, .NET 2.0)
Есть страница с четырьмя панелями.
на первой панели кнопка, которая запускает что-нибудь. В моём случае - отправку письма. Поскольку скорость интеренета у всех разная, отправка может занимать много времени. Необходимо, чтобы в течение этого времени кнопку "Отправка" нажать было нельзя.
Я делаю так:
основной процесс прячет первую панель и показывает панель с текстом, типа "Подождите". Создаю еще один процесс, который выполняет отправку.
По идее, этот процесс по окончании отправки должен показывать панель с сообщением, что всё ОК. Этого не происходит. Панель с надписью "Подождите" висит все время и никуда не хочет деваться. При этом почта уходит.
Если же почта не отправляется, то панель с собщением об ошибке отображается нормально и "Подождите" исчезает.
В чем проблема? Знает кто-нибудь?
Написал вот так:
Код:
protected void Page_Load(object sender, EventArgs e)
{
pnlOK.Visible = false;
pnlProc.Visible = false;
}
protected void btnClicked(object s, EventArgs e)
{
pnlProc.Visible = true;
pnlMain.Visible = false;
pnlOK.Visible = false;
Thread thrExec = new Thread(new ThreadStart(Process));
Thread.Sleep(500);
thrExec.Start();
}
private void Process()
{
int n;
for (int i = 0; i < 100000000; i++)
{
n = i;
}
pnlOK.Visible = true;
pnlMain.Visible = false;
pnlProc.Visible = false;
}
{
pnlOK.Visible = false;
pnlProc.Visible = false;
}
protected void btnClicked(object s, EventArgs e)
{
pnlProc.Visible = true;
pnlMain.Visible = false;
pnlOK.Visible = false;
Thread thrExec = new Thread(new ThreadStart(Process));
Thread.Sleep(500);
thrExec.Start();
}
private void Process()
{
int n;
for (int i = 0; i < 100000000; i++)
{
n = i;
}
pnlOK.Visible = true;
pnlMain.Visible = false;
pnlProc.Visible = false;
}
Не работает. (pnlOK не отображается, pnlProc не пропадает)
Информацию можно найти в MSDN. Если надо могу послать пример использования.
спасибо, попробую
Доступ к элементам из потока, в котором не были соданы эти элементы управления запрещён, отсюда и результат - ничего не работает. Для обращения к контролам из другого потока надо использовать синхронизированный метод Invoke этого контрола, например, pnlOk.Invoke а в него передавать код, который будет уже в родном для контрола потоке выполняться
Буду пробовать. BackgroundWorker не прокатит, мне кажется. Он для Win Forms более подходит.