在任务完成时运行函数
本文关键字:函数 运行 完成时 任务 | 更新日期: 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());
}