相关疑难解决方法(0)

等待与task.Result相同的已完成任务?

我正在阅读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,因为任务已经完成了?

c# asynchronous task async-await

107
推荐指数
2
解决办法
6万
查看次数

我应该什么时候等待我的asyncs?

我们目前正在重构我们项目的各个部分上下异步,是的!

由于我们的理解不同,我和同事(让我们称他为吉姆)对于我们的异步/等待代码将如何执行以及编写它的方式有不同的看法.

以下是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)

我的理解是:因为上面的服务furnitureappliance服务中的方法都需要House,所以House在继续之前它们会等待可用.然后,两个需要的方法House都会运行,但第二个方法(GetAppliancesForHouse)不会等到第一个方法在开始之前完成.

吉姆的理解是:我们应该只在需要时才等待这两种方法.这样他们就会彼此平行.他认为按照我的方式做,将导致第二种方法等待第一种方法,即:GetAppliancesForHouse等待GetFurnitureForHouse.

这些理解中的任何一个是否正确?或者我们一直在进行弥补?我们何时应该等待?

.net c# async-await

48
推荐指数
2
解决办法
2144
查看次数

异步和元组

我正在尝试第一次在异步函数中使用元组。测试时我无法捕捉到响应。我一直在谷歌搜索这个问题,但无法解决它。

我想运行一个返回三个字符串的异步函数。我无法收到回复。已尝试引用项目或名称。

这是代码:

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)

c# tuples async-await

0
推荐指数
1
解决办法
405
查看次数

标签 统计

async-await ×3

c# ×3

.net ×1

asynchronous ×1

task ×1

tuples ×1