Вам нужно будет перенести данные из одного потока в другой. Это можно сделать несколькими способами ...
Во-первых, ваш "фоновый" поток может обновить какую-то строковую переменную "CurrentStatus", которая изменяется по мере продвижения. Затем вы могли бы добавить в форму таймер, который затем захватил бы переменную CurrentStatus и обновил бы метку.
Во-вторых, вы можете просто вызвать операцию из фонового потока в поток пользовательского интерфейса с делегатом, используя свойство InvokeRequired элемента управления меткой. Так например ...
private delegate void UpdateStatusDelegate(string status);
private void UpdateStatus(string status)
{
if (this.label1.InvokeRequired)
{
this.Invoke(new UpdateStatusDelegate(this.UpdateStatus), new object[] { status });
return;
}
this.label1.Text = status;
}
Вы можете вызвать этот метод UpdateStatus () из любого потока (пользовательского интерфейса или фона), и он определит, нужно ли ему вызывать операцию в основном потоке пользовательского интерфейса (и если да, то делает ли это).
Чтобы на самом деле настроить поток, вы можете сделать это так:
private void StartProcessing()
{
System.Threading.Thread procThread = new System.Threading.Thread(this.Process);
procThread.Start();
}
private void Process() // This is the actual method of the thread
{
foreach (System.IO.FileInfo f in dir.GetFiles("*.txt"))
{
// Do processing
// Show progress bar
// Update Label on Form, "f.Name is done processing, now processing..."
UpdateStatus("Processing " + f.Name + "...");
}
}
Затем, когда пользователь нажимает кнопку «GO», вы просто вызываете StartProcessing ().