在任务完成时运行函数

本文关键字:函数 运行 完成时 任务 | 更新日期: 2023-09-27 18:25:11

我想异步运行一个函数来防止UI冻结。这里是按钮点击事件。

private void btnEncrypt_Click(object sender, EventArgs e)
{
    // Create new Vigenere object instant
    cryptor = new Vigenere(txtPassword.Text, txtBox.Text);
    // Run encryption async
    Task<string> T = new Task<string>(cryptor.Encrypt);
    T.Start();
}

现在,我希望在任务T完成时调用以下函数,并将其返回值作为如下参数:

private void Callback(string return_value)
{
    txtBox.Text = return_value
    // Some other stuff here
}

如何做到这一点?

在任务完成时运行函数

您可以使用ContinueWith(Action<Task>)方法。

所以你会有类似的东西

Task<string> t = new Task<string>(cryptor.Encrypt);
T.Start();
Task continuationTask = t.ContinueWith((encryptTask) => {
    txtBox.Text = encryptTask.Result;
    ...
})

实际上,这只是说在当前任务完成后执行操作,完成可能是成功运行、出错或由于取消而提前退出。您可能需要进行一些错误处理,以确保您没有尝试使用已取消或出现故障的任务的结果。

首先,将async添加到按钮单击事件中。尝试:

private async void btnEncrypt_Click(object sender, EventArgs e)
{
     cryptor = new Vigenere(txtPassword.Text, txtBox.Text);
     await Task.Run(() => cryptor.Encrypt()).ContinueWith(result => { Callback(result.Result); });
}

您想要使用Task.Run并等待它。这将使该方法在线程池线程上执行,并在完成后将返回的字符串分配给TextBox:

private async void btnEncrypt_Click(object sender, EventArgs e)
{
     cryptor = new Vigenere(txtPassword.Text, txtBox.Text);
     textBox.Text = await Task.Run(() => cryptor.Encrypt());
}