gpt4 book ai didi

c# - 异步初始化局部变量

转载 作者:行者123 更新时间:2023-11-30 17:41:57 27 4
gpt4 key购买 nike

使用 .Net 4.5+ 中可用的异步功能, 有没有一种方法可以同时初始化多个局部变量,而不必分两步进行? 还有另一种方法可以延迟阻塞父变量吗直到尝试取消引用等待的变量?

示例:我有一个方法,在该方法中,我获得了三个 ID,用于从三个独立的服务中获取对象。每项服务都需要很长时间才能返回,我想尽量减少所需的时钟时间。对象创建没有相互依赖性。

我能做什么:

string MyFunc(long userId, long moduleId, long targetId) {
var userTask = _userRepo.Get(userId);
var moduleTask = _moduleRepo.Get(moduleId);
var targetTask = _targetRepo.Get(targetId);

var user = await userTask;
var module = await moduleTask;

var action = module.GetActionFor(user);

var target = await targetTask;
action.ApplyTo(target);

return string.Format("{0} begins {1} at {2}",
user.Name,
action.Description,
target.Location);
}

如何删除中间的 Tasks 任务变量?

澄清:

我正在寻找更简洁的内容。除了初始分配之外,我不需要任务,结果在操作的其余部分中多次使用。

这样做实际上是同步运行代码。如果每个 Get 语句需要 1 秒才能返回,则该 block 需要 3 秒才能完成:

var user = await _userRepo.Get(userId);
var module = await _moduleRepo.Get(moduleId);
var target = await _targetRepo.Get(targetId);

执行以下操作会导致代码变得难以阅读,尤其是当对象需要多次使用时:

var user = _userRepo.Get(userId);
var module = _moduleRepo.Get(moduleId);
var target = _targetRepo.Get(targetId);

var action = (await module).GetActionFor(await user);
action.ApplyTo(await target);

var formattedString = string.Format("{0} begins {1} at {2}",
(await user).Name,
action.Description,
(await target).Location);

最佳答案

我不相信有什么好方法可以准确地得到你想要的东西(至少在没有一些严肃的编译时元编程的情况下是这样)。

我能想到的最接近的是:

User user = null;
Module module = null;
Target target = null;

await RunAll(
async () => user = await _userRepo.Get(userId),
async () => module = await _moduleRepo.Get(moduleId),
async () => target = await _targetRepo.Get(targetId));

var action = module.GetActionFor(user);
action.ApplyTo(target);

var formattedString = string.Format("{0} begins {1} at {2}",
user.Name,
action.Description,
target.Location);

RunAll() 的定义如下:

static Task RunAll(params Func<Task>[] funcs)
{
return Task.WhenAll(funcs.Select(f => f()));
}

关于c# - 异步初始化局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32316183/

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