我正在阅读Stephen Cleary撰写的"C#Cookbook中的并发",我注意到以下技巧:
var completedTask = await Task.WhenAny(downloadTask, timeoutTask);
if (completedTask == timeoutTask)
return null;
return await downloadTask;
Run Code Online (Sandbox Code Playgroud)
downloadTask是对httpclient.GetStringAsync的调用,timeoutTask正在执行Task.Delay.
如果它没有超时,则downloadTask已经完成.为什么有必要做第二次等待而不是返回downloadTask.Result,因为任务已经完成了?
我们目前正在重构我们项目的各个部分上下异步,是的!
由于我们的理解不同,我和同事(让我们称他为吉姆)对于我们的异步/等待代码将如何执行以及编写它的方式有不同的看法.
以下是Jim写的示例方法:
public async Task<HouseModel> GetHouseModel(Guid houseId)
{
House house = await _houseService.GetHouse(houseId);
Task<IEnumerable<Furniture>> furniture = _furnitureService.GetFurnitureForHouse(house);
Task<IEnumerable<Appliances>> appliances = _applianceService.GetAppliancesForHouse(house);
return _houseModelFactory.MakeHouseModel(await furniture, await appliances);
}
Run Code Online (Sandbox Code Playgroud)
以及如何编写它的示例:
public async Task<HouseModel> GetHouseModel(Guid houseId)
{
House house = await _houseService.GetHouse(houseId);
IEnumerable<Furniture> furniture = await _furnitureService.GetFurnitureForHouse(house);
IEnumerable<Appliances> appliances = await _applianceService.GetAppliancesForHouse(house);
return _houseModelFactory.MakeHouseModel(furniture, appliances);
}
Run Code Online (Sandbox Code Playgroud)
我的理解是:因为上面的服务furniture
和appliance
服务中的方法都需要House
,所以House
在继续之前它们会等待可用.然后,两个需要的方法House
都会运行,但第二个方法(GetAppliancesForHouse
)不会等到第一个方法在开始之前完成.
吉姆的理解是:我们应该只在需要时才等待这两种方法.这样他们就会彼此平行.他认为按照我的方式做,将导致第二种方法等待第一种方法,即:GetAppliancesForHouse
等待GetFurnitureForHouse
.
这些理解中的任何一个是否正确?或者我们一直在进行弥补?我们何时应该等待?
我正在尝试第一次在异步函数中使用元组。测试时我无法捕捉到响应。我一直在谷歌搜索这个问题,但无法解决它。
我想运行一个返回三个字符串的异步函数。我无法收到回复。已尝试引用项目或名称。
这是代码:
var _moonAndSunResult = CleanSunAndMoonJson(_moonJson);
print(_moonAndSunResult);
Run Code Online (Sandbox Code Playgroud)
尝试以不同的方式引用 _moonAndSunResult 。
// async Task<Tuple<string, string, string, string>> CleanSunAndMoonJson(string _json)
async Task<(string, string, string, string)> CleanSunAndMoonJson(string _json)
{
print("sunRise: " + GetCorrectTimeFormat("sunRise", _json));
print("sunSet: " + GetCorrectTimeFormat("sunSet", _json));
print("moonRise: " + GetCorrectTimeFormat("moonRise", _json));
print("moonSet: " + GetCorrectTimeFormat("moonSet", _json));
Utility.sunrise = GetCorrectTimeFormat("sunRise", _json);
Utility.sunset = GetCorrectTimeFormat("sunSet", _json);
Utility.moonrise = GetCorrectTimeFormat("moonRise", _json);
Utility.moonset = GetCorrectTimeFormat("moonSet", _json);
await Task.Yield();
//return (firstValue, secondValue, thirdValue);
//return new Tuple<string, string, string, string>(Utility.sunrise, Utility.sunset, Utility.moonrise, Utility.moonset);
return (Utility.sunrise, …
Run Code Online (Sandbox Code Playgroud)