将线程转换为任务

时间:2017-02-25 15:31:13

标签: c# multithreading asynchronous task invoke

我正在尝试使用以下代码中的.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;
            }
        }

当任务正在运行时,文本框必须更新,并且当任务终止或取消时,文本框应< strong>未更新。

避免中断执行的类似消息:&#34;当前线程不在单线程公寓中&#34;

它将用于 桌面和网络

谢谢,各种帮助。

1 个答案:

答案 0 :(得分:2)

这是直接转换为异步任务模式:

public async void button2_Click(object sender, EventArgs e)
{
    await Proceso1();
}

private async Task Proceso1()
{
    for (int i = 1; i < 101; i++)
    {
        Actualizar1(i);
        await Task.Delay(1000);
    }
}

private 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;
    }
}

那就是说,我不确定这是什么意思,你无法使用System.Windows.Forms.Timer来实现更好的目标。