gpt4 book ai didi

c# - 这三个 Task Continuation 之间有什么区别?

转载 作者:行者123 更新时间:2023-11-30 16:56:47 25 4
gpt4 key购买 nike

我有这两种情况,但我不明白为什么事情会这样发生:

    static void Main(string[] args)
{
Console.WriteLine("***Starting T1");
//run two tasks sequentially
Task t = FirstTask().ContinueWith(_ => SecondTask(), TaskContinuationOptions.OnlyOnRanToCompletion);
//register succeded and faulted continuations
t.ContinueWith(_ => Completion(), TaskContinuationOptions.OnlyOnRanToCompletion);
t.ContinueWith(_ => Faulted(), TaskContinuationOptions.OnlyOnFaulted);
Console.ReadLine();
Console.WriteLine("***Starting T2");
Task t2 = FirstTask().ContinueWith(_ => FaultTask(), TaskContinuationOptions.OnlyOnRanToCompletion);
t2.ContinueWith(_ => Completion(), TaskContinuationOptions.OnlyOnRanToCompletion);
t2.ContinueWith(_ => Faulted(), TaskContinuationOptions.OnlyOnFaulted);
Console.ReadLine();
Console.WriteLine("***Starting T3");
Task t3 = FirstTask().ContinueWith(ant => ant.ContinueWith(_ => FaultTask(), TaskContinuationOptions.OnlyOnRanToCompletion));
t3.ContinueWith(_ => Completion(), TaskContinuationOptions.OnlyOnRanToCompletion);
t3.ContinueWith(_ => Faulted(), TaskContinuationOptions.OnlyOnFaulted);
Console.ReadLine();
}

private static Task FirstTask()
{
return Task.Run(() =>
{
Console.WriteLine("Task 1");
Thread.Sleep(1000);
});
}

private static Task SecondTask()
{
return Task.Run(() =>
{
Console.WriteLine("Task 2");
Thread.Sleep(1000);
});
}

private static Task FaultTask()
{
return Task.Run(() =>
{
Console.WriteLine("Throw...");
Thread.Sleep(1000);
throw new ArgumentException();
});
}

private static void Completion()
{
Console.WriteLine("Complete");
}

private static void Faulted()
{
Console.WriteLine("Faulted");
}

在情况 1 中,一切按预期运行。但是,如果删除 FirstTask() 中的 Sleep(),则无法保证任务按顺序运行。

在情况 2 中,Faulted() 处理程序未运行。我预计会发生这种情况,因为存在未处理的异常。

在情况 3 中,在 Complete() 处理程序运行后抛出异常。我对为什么会出现这种顺序感到困惑。

基本上,我希望能够链接尽可能多的任务,并让它们在前一个任务完成后按顺序运行。创建链后,我将显示一个等待表单并将 OnlyOnRanToCompletionOnlyOnCancelledOnlyOnFaulted 的延续注册到最终任务中(阅读: 全部完成后) 关闭表单 - 显示成功或错误。

MSDN 在这里指的是那些不可用于多任务延续的选项吗?

最佳答案

您在 t 上的返回类型和 t2Task<Task>不仅仅是一个任务。 T3 是 Task<Task<Task>> .要获得所需的行为,您应该能够 Unwrap将为您提供代表整个操作的任务的任务(阅读文档以获取更多信息):

Console.WriteLine("***Starting T1");
//run two tasks sequentially
Task<Task> t = FirstTask().ContinueWith(_ => SecondTask(), TaskContinuationOptions.OnlyOnRanToCompletion);

//register succeded and faulted continuations
t.Unwrap().ContinueWith(_ => Completion(), TaskContinuationOptions.OnlyOnRanToCompletion);
t.Unwrap().ContinueWith(_ => Faulted(), TaskContinuationOptions.OnlyOnFaulted);

Console.ReadLine();
Console.WriteLine("***Starting T2");

Task<Task> t2 = FirstTask().ContinueWith(_ => FaultTask(), TaskContinuationOptions.OnlyOnRanToCompletion);
t2.Unwrap().ContinueWith(_ => Completion(), TaskContinuationOptions.OnlyOnRanToCompletion);
t2.Unwrap().ContinueWith(_ => Faulted(), TaskContinuationOptions.OnlyOnFaulted);
Console.ReadLine();

我建议尽可能使用 async/await 模式,因为它可以更轻松地处理此类任务。

关于c# - 这三个 Task Continuation 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27501548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com