我想异步运行一个函数以防止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
}
如何实现这一目标?
答案 0 :(得分:6)
您可以使用ContinueWith(Action<Task>)
方法。
所以你会有像
这样的东西Task<string> t = new Task<string>(cryptor.Encrypt);
T.Start();
Task continuationTask = t.ContinueWith((encryptTask) => {
txtBox.Text = encryptTask.Result;
...
})
实际上,这只是表示在当前任务完成后执行操作,完成可能会因取消而成功运行,故障或退出。您可能希望进行一些错误处理,以确保您没有尝试使用已取消或出现故障的结果。
答案 1 :(得分:2)
首先,将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); });
}
答案 2 :(得分:1)
您想使用private async void btnEncrypt_Click(object sender, EventArgs e)
{
cryptor = new Vigenere(txtPassword.Text, txtBox.Text);
textBox.Text = await Task.Run(() => cryptor.Encrypt());
}
并等待它。这将使该方法在线程池线程上执行,并在完成后将返回的字符串分配给TextBox:
{{1}}