任务完成后运行函数

时间:2015-12-01 17:14:35

标签: c# multithreading asynchronous callback asynccallback

我想异步运行一个函数以防止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
}

如何实现这一目标?

3 个答案:

答案 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}}