0

Есть форма, мне надо вызвать ее в другом потоке, и еще одновременно менять параметр Value у progressBar.

int precentage = f1.Allcount / 100;
while (ChkedComplete)
{
    if (countCheked / precentage > 100)
    {
        ProgressBar1.Value = 100;
    }
    else
    {
        ProgressBar1.Value = countCheked / precentage;
    } 
    panel2.Visible = true;
}

как все это реализовать?

STALER
  • 120

1 Answers1

1

1)Запустить форму в отдельном потоке можно через Task, передав делегат необходимого вида.

2)Control привязан к потоку в котором он был создан=> менять его из вне вы так просто не сможете, как собственно вы и поняли.

Поэтому на помощь к нам приходит InvokeRequired, который позволяет понять нужно ли вызывать Invoke, что бы обратится к контролу.

Пример взят отсюда:

private void SetText(string text)
        {
            // InvokeRequired required compares the thread ID of the
            // calling thread to the thread ID of the creating thread.
            // If these threads are different, it returns true.
            if (this.textBox1.InvokeRequired)
            {   
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                this.textBox1.Text = text;
            }
        }
iluxa1810
  • 24,899