Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继续使用返回任务的方法_C#_Task Parallel Library - Fatal编程技术网

C# 继续使用返回任务的方法

C# 继续使用返回任务的方法,c#,task-parallel-library,C#,Task Parallel Library,我想执行三个步骤的工作。一个准备任务、一个封装在返回任务的方法中的工作任务和一个需要上一步结果的清理任务。但我不确定我是否以正确的方式展开并访问“Result”属性,或者是否有更清晰的版本将该方法包含在执行链中 static void Main(string[] args) { Task.Factory.StartNew(() => Console.WriteLine("Prepare")) .ContinueWith(x => Work())

我想执行三个步骤的工作。一个准备任务、一个封装在返回任务的方法中的工作任务和一个需要上一步结果的清理任务。但我不确定我是否以正确的方式展开并访问“Result”属性,或者是否有更清晰的版本将该方法包含在执行链中

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();
}