任务完成后运行一个函数

Xby*_*nce 2 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();
}
Run Code Online (Sandbox Code Playgroud)

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

private void Callback(string return_value)
{
    txtBox.Text = return_value

    // Some other stuff here
}
Run Code Online (Sandbox Code Playgroud)

怎么做到这一点?

Ste*_*oss 6

你可以做的是使用该ContinueWith(Action<Task>)方法.

所以你会有类似的东西

Task<string> t = new Task<string>(cryptor.Encrypt);
T.Start();

Task continuationTask = t.ContinueWith((encryptTask) => {
    txtBox.Text = encryptTask.Result;
    ...
})
Run Code Online (Sandbox Code Playgroud)

实际上,这只是表示在当前任务完成后执行操作,完成可能会因取消而成功运行,故障或退出.您可能希望进行一些错误处理,以确保您没有尝试使用已取消或出现故障的任务的结果.

  • 但问题是ContinueWith操作不在主线程上执行,在我的例子中它在工作线程中执行! (2认同)

Yuv*_*kov 1

您想使用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());
}
Run Code Online (Sandbox Code Playgroud)