gpt4 book ai didi

c# - 组合等待与 ContinueWith

转载 作者:行者123 更新时间:2023-11-30 21:26:29 24 4
gpt4 key购买 nike

我遇到了以下我试图理解的异步代码(针对此示例进行了简化):

class Program
{
static async Task Main(string[] args)
{
var foo = new Foo();

try
{
var bar = new Bar();
await foo.ComputeNumber(bar.GetNumberAsync());
}
catch (Exception e)
{
Console.WriteLine($"Logged exception: {e}");
}
Console.WriteLine($"The number is {foo.Number}");
Console.ReadKey();
}
}

public class Foo
{
public int Number { get; private set; } = 0;

public async Task ComputeNumber(Task<int> inputTask)
{
await inputTask.ContinueWith(x => Number = x.Result);
}
}

public class Bar
{
public async Task<int> GetNumberAsync()
{
return await Task.Factory.StartNew(() =>
{
if (DateTime.Now.Date.DayOfWeek != DayOfWeek.Monday)
{
throw new Exception("This function works only on Mondays.");
}
return 17;
});
}
}

这段代码按我预期的方式工作(至少我希望如此),但我认为这个问题应该通过以下方式之一解决(我认为两者都是正确的)。 Bar 类将保持不变。

第一种(异步/等待)方法:

class Program
{
static async Task Main(string[] args)
{
var foo = new Foo();

try
{
var bar = new Bar();
await foo.ComputeNumber(bar.GetNumberAsync());
}
catch (Exception e)
{
Console.WriteLine($"Logged exception: {e}");
}
Console.WriteLine($"The number is {foo.Number}");
Console.ReadKey();
}
}

public class Foo
{
public int Number { get; private set; } = 0;

public async Task ComputeNumber(Task<int> inputTask)
{
Number = await inputTask;
}
}

第二种(基于任务的)方法:

class Program
{
static void Main(string[] args)
{
var foo = new Foo();
var bar = new Bar();
foo.ComputeNumber(bar.GetNumberAsync());

Console.WriteLine($"The number is {foo.Number}");
Console.ReadKey();
}
}

public class Foo
{
public int Number { get; private set; } = 0;

public void ComputeNumber(Task<int> inputTask)
{
inputTask.ContinueWith(x =>
{
if (x.IsFaulted)
{
Console.WriteLine($"Logged exception: {x.Exception}");
}
else
{
Number = x.Result;
}
});
}
}

对于为什么可以这样编写使用异步代码的原始示例的每一种解释,我都很感激。

最佳答案

可以想到await作为替代 ContinueWith 大部分用途的语言功能, 因此将两者混合似乎是不必要的。

请注意,您的第二次重写在两个方面与第一次不同。

  1. 它吞下了错误,而不是让它们浮出水面。

  2. 它不会返回 Task所以调用者不知道什么时候 Number已设置为最终结果。

ComputeNumber目的可疑(这可能是因为它被简化以在此处发布)。为什么不简单地 await bar.GetNumberAsync()然后在后续语句中使用获得的值?点await是允许Task<T>T 的处理方式大致相同在程序代码中。

关于c# - 组合等待与 ContinueWith,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59185133/

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