C# 继续使用返回任务的方法
我想执行三个步骤的工作。一个准备任务、一个封装在返回任务的方法中的工作任务和一个需要上一步结果的清理任务。但我不确定我是否以正确的方式展开并访问“Result”属性,或者是否有更清晰的版本将该方法包含在执行链中C# 继续使用返回任务的方法,c#,task-parallel-library,C#,Task Parallel Library,我想执行三个步骤的工作。一个准备任务、一个封装在返回任务的方法中的工作任务和一个需要上一步结果的清理任务。但我不确定我是否以正确的方式展开并访问“Result”属性,或者是否有更清晰的版本将该方法包含在执行链中 static void Main(string[] args) { Task.Factory.StartNew(() => Console.WriteLine("Prepare")) .ContinueWith(x => Work())
static void Main(string[] args)
{
Task.Factory.StartNew(() => Console.WriteLine("Prepare"))
.ContinueWith(x => Work())
.ContinueWith(x => Console.WriteLine(x.Unwrap().Result));
Console.ReadLine();
}
private static Task<string> Work()
{
Thread.Sleep(1500);
return Task.Factory.StartNew(() => "See my results...");
}
static void Main(字符串[]args)
{
Task.Factory.StartNew(()=>Console.WriteLine(“准备”))
.ContinueWith(x=>Work())
.ContinueWith(x=>Console.WriteLine(x.Unwrap().Result));
Console.ReadLine();
}
私有静态任务工作()
{
睡眠(1500);
返回Task.Factory.StartNew(()=>“查看我的结果…”);
}
您可以使用一个异步方法执行所有步骤并返回任务:
static async Task DoAsync()
{
Console.WriteLine("Prepare");
Console.WriteLine(await WorkAsync());
}
如果使用,很容易确保使用所需的语义执行操作。此外,它还以可预测的方式处理已取消和出现故障的任务(至少可以说,当您不使用async
/wait
时,这是一项令人畏惧的壮举)
- 用于不返回
(值或任务
)的延续无效
- 用于返回
或任务
任务
static void Main(string[] args)
{
Task operation = Task.Factory.StartNew(() => Console.WriteLine("Prepare"))
.Then(_ => WorkAsync())
.Select(resultTask => Console.WriteLine(resultTask.Result));
operation.Wait();
Console.ReadLine();
}
private static Task<string> WorkAsync()
{
return DelayedTask.Delay(TimeSpan.FromMilliseconds(1500))
.Select(_ => "See my results...");
}
为什么不把它们放在同一个任务中呢?这样做有什么好处?感谢您对展开位置的建议。我不会在生产代码中这样做。目前,我只是想更好地理解连续性。我试图编一个例子来使用连续性。你的解决方案肯定会奏效。
static void Main(string[] args)
{
Task operation = Task.Factory.StartNew(() => Console.WriteLine("Prepare"))
.Then(_ => WorkAsync())
.Select(resultTask => Console.WriteLine(resultTask.Result));
operation.Wait();
Console.ReadLine();
}
private static Task<string> WorkAsync()
{
return DelayedTask.Delay(TimeSpan.FromMilliseconds(1500))
.Select(_ => "See my results...");
}
// NOTE: I WOULD NOT USE THIS CODE
// (preferring the Threading Library or async/await instead)
static void Main(string[] args)
{
Task.Factory.StartNew(() => Console.WriteLine("Prepare"))
.ContinueWith(x => Work()).Unwrap()
.ContinueWith(x => Console.WriteLine(x.Result));
Console.ReadLine();
}