【发布时间】:2017-07-16 10:11:06
【问题描述】:
我正在尝试在以下代码中使用 .Net Task。
Thread hilo;
delegate void delegado(int valor);
private void button2_Click(object sender, EventArgs e)
{
hilo = new Thread(new ThreadStart(Proceso1));
hilo.Start();
}
public void Proceso1()
{
for (int i = 1; i < 101; i++)
{
delegado MD = new delegado(Actualizar1);
this.Invoke(MD, new object[] { i });
Thread.Sleep(1000);
}
}
public void Actualizar1(int valor)
{
ProgressBar1.Value = valor;
int incremento= valor % 4;
switch (incremento)
{
case 1: lblMensaje.Text = "Estamos procesando ."; break;
case 2: lblMensaje.Text = "Estamos procesando .."; break;
case 3: lblMensaje.Text = "Estamos procesando ..."; break;
default: lblMensaje.Text = "Estamos procesando ...."; break;
}
}
任务运行时,文本框必须更新,而且,当任务终止或取消时,文本框应该不会更新。
并避免出现中断执行的类似消息:“当前线程不在单线程单元中”
它将用于桌面和网络。
谢谢,各种帮助。
【问题讨论】:
-
由于所有
Proceso1所做的都是将Actualizar1推送到UI 线程,因此不清楚您要实现什么。这里的线程/任务没有任何好处。 -
不要在工作线程中使用
Invoke(),因为它会导致线程死锁。而是使用BeginInvoke() -
....不管怎样,产生一个线程,除了线程编组到 UI 线程之外什么都不做,然后休眠 1 秒是非常浪费的
标签: c# multithreading asynchronous task invoke