У меня есть задача, выполнение которой может занять некоторое время.
Я попробовал простую демонстрацию, но она по какой-то причине блокирует поток графического интерфейса. Я думал, что задача будет асинхронной, и графический интерфейс будет обновляться во время выполнения задачи.
Возможно ли это с помощью задания?
private void button5_Click(object sender, EventArgs e)
{
var task = Task.Factory.StartNew(() => DoSomething());
while (!task.IsCompleted)
{
label1.Text += ".";
if (label1.Text.Length == 5)
label1.Text = ".";
}
}
private void DoSomething()
{
Thread.Sleep(5000);
}
ОБНОВЛЕНИЕ: После ответа Дэмиена я попробовал следующее, но ЦП увеличил
private void button5_Click(object sender, EventArgs e)
{
var task = Task.Factory.StartNew(() => DoSomething());
}
public delegate void dgUpdateLabel();
private void UpdateLabel()
{
if (this.InvokeRequired)
{
this.BeginInvoke(new dgUpdateLabel(UpdateLabel), new object[] { });
}
else
{
label1.Text += ".";
if (label1.Text.Length == 5)
label1.Text = ".";
}
}
private void DoSomething()
{
var task = Task.Factory.StartNew(() => Sleep());
while (!task.IsCompleted)
{
UpdateLabel();
}
}
private void Sleep()
{
Thread.Sleep(5000);
}
ОБНОВЛЕНИЕ2: Я думаю, что скорость попытки обновить ярлык слишком высока для него. Если вы поместите Thread.Sleep (500) после вызова метода UpdateLabel, он будет работать как положено.