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返回的任务的方法并获得结果.我怎样才能开始并获得结果?
你可以做类似下面的事情。作为示例,我创建了三个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)
如果您有一个带有textBox1、textBox2和的表单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 线程。一切顺利。