线程完成后如何调用函数?

更多阿米尔

我尝试在线程完成后调用一个函数,但不能。我只能while(threadName.isAlive)在函数调用者代码之前使用method,但是这样做并不好,因为当我使用此代码时程序会停止你有什么主意吗?

public partial class Form1 : Form
{
    Thread myThread;
    string myString = string.Empty;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        myThread = new Thread(write);
        myThread.Start();
        while (myThread.IsAlive) ;
        textBox1.Text = myString; 
    }

    public void write()
    {
        for (int i = 0; i < 10; i++) {

            myString += "aaa " + i + "\r\n";
            Thread.Sleep(1000);
        }
    }
}
马修·沃森

如果必须附加到aThread而不是a,Task则可以启动一个任务以等待线程退出,然后运行一些其他代码,如下所示:

using System;
using System.Threading;
using System.Threading.Tasks;

namespace Demo
{
    static class Program
    {
        static void Main()
        {
            Thread thread = new Thread(work);
            thread.Start();

            Task.Run(() =>
            {
                thread.Join();
                Console.WriteLine("Run after thread finished");
            });

            Console.ReadLine();
        }

        static void work()
        {
            Console.WriteLine("Starting work");
            Thread.Sleep(1000);
            Console.WriteLine("Finished work");
        }
    }
}

但是,解决这个现代的方法是使用Taskawaitasync

例如:

async void button1_Click(object sender, EventArgs e)
{
    textBox1.Text = "Awaiting task";
    await writeAsync();
    textBox1.Text = "Task finished";
}

Task writeAsync()
{
    return Task.Run(() => write());
}

void write()
{
    Thread.Sleep(10000);
}

如果尝试第二种方法,则会看到UI保持响应,而文本框显示“正在等待任务”。

还要注意,通常您希望在等待任务时阻止用户再次按下按钮,以避免运行多个任务。最简单的方法是在任务处于活动状态时禁用按钮,如下所示:

async void button1_Click(object sender, EventArgs e)
{
    button1.Enabled = false;

    textBox1.Text = "Awaiting task";
    await writeAsync();
    textBox1.Text = "Task finished";

    button1.Enabled = true;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章