如何启动延续任务实例?

gig*_*igi 7 .net c# task-parallel-library

我有这个方法,启动一个任务,并返回最后一个cahined任务,以获得结果:

public Task<double> GetTask()
{
    return Task.Factory.StartNew((() => 10))
        .ContinueWith(i =>
        {
            return i.Result + 2;
        })
        .ContinueWith(i =>
        {
            return (double)i.Result;
        });
}
Run Code Online (Sandbox Code Playgroud)

我想有相同的方法返回相同的任务,但没有像Task.Factory.StartNew那样自动启动它:

public Task<double> GetTask2()
{
    return new Task<int>((() => 10))
        .ContinueWith(i =>
        {
            return i.Result + 2;
        })
        .ContinueWith(i =>
        {
            return (double)i.Result;
        });
}
Run Code Online (Sandbox Code Playgroud)

无论如何,我无法找到启动GetTask2返回的任务的方法并获得结果.我怎样才能开始并获得结果?

Moo*_*ght 1

你可以做类似下面的事情。作为示例,我创建了三个TextBoxs 来进行说明。

首先使用以下方法选择您所需的任务

public Task<double> GetTask()
{
    // Return choice of task.
    return new Task<double>(() => 10.0);
}
Run Code Online (Sandbox Code Playgroud)

Task然后使用类似的方法构建所选的延续(忽略错误处理)

public Task<double> DefineTaskContinuation(Task<double> _task)
{
    _task.ContinueWith(i =>
        {
            textBox2.Text = (i.Result + 2).ToString();
            return i.Result + 2;
        }, TaskScheduler.FromCurrentSynchronizationContext())
    .ContinueWith(i =>
        {
            textBox3.Text = (i.Result + 2).ToString();
        }, TaskScheduler.FromCurrentSynchronizationContext());
     return _task;
}
Run Code Online (Sandbox Code Playgroud)

如果您有一个带有textBox1textBox2和的表单textBox3,您可以利用计数的输出来填充这些文本框,如下所示

private void button1_Click(object sender, EventArgs e)
{
    Task<double> task = DefineTaskContinuation(GetTask());
    task.Start();
    textBox1.Text = task.Result.ToString();
} 
Run Code Online (Sandbox Code Playgroud)

输出:

结果

我希望这有帮助。

编辑:由于@usr 的评论非常正确,答案已更改。请注意,这TaskScheduler.FromCurrentSynchronizationContext()不是必需的,但用于方便我将输出打印到 UI 线程。一切顺利。