如何在 .NET 4.5 中“同时”运行这两个方法?

2023-12-19

我有一个方法可以执行 2独立的逻辑片段。我希望我能同时运行它们同时..并且仅在这两个子方法完成后才继续。

我试图弄清楚async/await语法,但我就是不明白。

这是代码:

public PewPew SomeMethod(Foo foo)
{
    var cats = GetAllTheCats(foo);
    var food = GetAllTheFood(foo);

    return new PewPew
               {
                   Cats = cats,
                   Food = food
               };
}

private IList<Cat> GetAllTheCats(Foo foo)
{
    // Do stuff, like hit the Db, spin around, dance, jump, etc...
    // It all takes some time.
    return cats;
}

private IList<Food> GetAllTheFood(Foo foo)
{
    // Do more stuff, like hit the Db, nom nom noms...
    // It all takes some time.
    return food;
}

因此,通过上面的代码,我想说:同时去获取所有的猫和食物。一旦我们完成,然后返回一个新的PewPew.

我很困惑,因为我不确定上面是哪些课程async或返回一个Task等等。全部?只是两个私人的吗?我也猜测我需要利用Task.WaitAll(tasks)方法,但我不确定如何setup同时运行的任务。

好心人给点建议?


以下是您可能想要执行的操作:

public async Task<PewPew> SomeMethod(Foo foo)
{
    // get the stuff on another thread 
    var cTask = Task.Run(() => GetAllTheCats(foo));
    var fTask = Task.Run(() => GetAllTheFood(foo));

    var cats = await cTask;
    var food = await fTask;

    return new PewPew
               {
                   Cats = cats,
                   Food = food
               };
}

public IList<Cat> GetAllTheCats(Foo foo)
{
    // Do stuff, like hit the Db, spin around, dance, jump, etc...
    // It all takes some time.
    return cats;
}

public IList<Food> GetAllTheFood(Foo foo)
{
    // Do more stuff, like hit the Db, nom nom noms...
    // It all takes some time.
    return food;
}

这里有两件事你需要理解:

  1. 这有什么区别:

    var cats = 等待任务; var food = 等待任务;

和这个:

Task.WaitAll(new [] {cTask, fTask});

两者都会给你类似的结果,在某种意义上让 2async任务完成然后return new PewPew- 然而,不同的是Task.WaitAll()将阻塞当前线程(如果是 UI 线程,则 UI 将冻结)。反而,await将分解SomeMethod在状态机中说,然后从SomeMethod当它遇到时给它的调用者await关键词。它不会阻塞线程。下面的代码await将计划在何时运行async任务结束了。

  1. 你也可以这样做:

    var cats = wait Task.Run(() => GetAllTheCats(foo)); var food = wait Task.Run(() => GetAllTheFood(foo));

然而,这不会启动async同时执行任务。第一个任务结束后将开始第二个任务。这是因为如何await关键字有效。

编辑:如何使用SomeMethod- 在调用树开始的某个地方,你必须使用Wait() or Result财产 - 或者 - 你必须await from async void。 一般来说,async void将是一个事件处理程序:

public async void OnSomeEvent(object sender, EventArgs ez) 
{ 
  Foo f = GetFoo();
  PewPew p = await SomeMethod(f);
}

如果没有则使用Result财产。

public Foo2 NonAsyncNonVoidMethod() 
{
   Foo f = GetFoo();
   PewPew p = SomeMethod(f).Result; //But be aware that Result will block thread
  
   return GetFoo2(p);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 .NET 4.5 中“同时”运行这两个方法? 的相关文章

  • 是否有可能将 *.pdb 文件包含到发布版本中以查看错误行号?

    我做了一个项目 所有设置都是默认的 当我在调试模式 构建配置 调试 下运行它并遇到异常时 它转储到我的自定义日志记录机制 其中包含错误行号 但是当我运行发布构建时 记录相同的异常 没有行号 只有方法抛出和记录调用堆栈 是否有可能在发布配置
  • JetBrains Rider 针对 4.5 框架,无法切换到 4.7

    基本上 当尝试添加不支持旧框架的 NuGet 包时 会出现错误 但是在项目配置中只有 4 5 可用 在项目创建过程中 不存在选择目标的选项 有什么方法可以正确配置它吗 I haven t found out how to set up NE
  • std::bind2nd 和 std::bind 与二维数组和结构数组

    我知道 C 有 lambda 并且 std bind1st std bind2nd 和 std bind 已弃用 然而 从C 的基础开始 我们可以更好地理解新特性 所以 我从这个非常简单的代码开始 使用int 数组s 第一个例子 与std
  • ASMX Web 服务,测试表单仅在本地计算机上适用于一种 WebMethod

    我有一个正在测试的 ASMX WebService 并且在大多数方法上我都可以使用测试表单进行测试 然而 我确实有一种方法 测试表上写着 The test form is only available for requests from t
  • 如何部署包含第三方 DLL 文件的 C# 应用程序?

    首先 我对部署了解不多 我希望我的问题有意义 我需要将 C 应用程序安装 部署到多个桌面 它需要一个第三方 DLL 文件 一个 C 库 lpsolve55 dll 对于那些感兴趣的人 它是一个免费的 MIP LP 求解器 请参阅 lpsol
  • 尽管浮点数相同,但它们并不相等? [复制]

    这个问题在这里已经有答案了 下面的程序输出This No is not same 当两个数字相同时为什么会这样做 void main float f 2 7 if f 2 7 printf This No is same else prin
  • 使用默认行为将模型绑定到接口

    我正在尝试将控制器操作绑定到接口 但仍保持默认的绑定行为 public class CoolClass ISomeInterface public DoSomething get set ISomeInterface public clas
  • C#生成的csv文件通过电子邮件发送嵌入到Lotus Note中电子邮件的底部

    我遇到了一个奇怪的问题 即使用 NET SmtpClient 通过电子邮件发送的 CSV 附件出现在电子邮件底部 而不是 Lotus Note 中的附件 我只是不知道如何解决这个问题 而且我无法访问客户端计算机 这使得调试非常困难 我可以采
  • += 运算符在 C++ 中是如何实现的?

    这是我一直在思考的一个问题 但从未找到任何资源来说明这个问题的答案 事实上它不仅是为了 也适用于它的兄弟姐妹 即 等等 当然不是 考虑这个例子 int a 5 a 4 this will make a 9 现在考虑等效表达式 a a 4 T
  • 主构造函数不再在 VS2015 中编译

    直到今天 我可以使用主构造函数 例如 public class Test string text private string mText text 为了能够做到这一点 在以前的 Visual Studio CTP 中 我必须将其添加到 c
  • Web 文本编辑器中的 RTF 格式

    网络上是否有支持 RTF 格式文档输入的文本编辑器 我知道这对 webdev 来说有点奇怪 但我需要从数据库中读取 RTF 文档 并在基于 Web 的文本编辑器中对其进行编辑 然后将其存储回 RTF 中 在我在转换工具上投入太多资金之前 我
  • 如果我重新分配并且新大小为 0,会发生什么情况。这与释放等效吗?

    给出以下代码 int a NULL a calloc 1 sizeof a printf d n a a realloc a 0 printf d n a return 0 它返回 4078904 0 这个 realloc 相当于 free
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • 如何在 ASP.NET Core 项目中使用 MStest 测试 Ok() 结果

    我正在使用 MStest 来测试我的控制器 我想测试这个动作 HttpGet Name GetGroups public async Task
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • 如何阻止 Control-I 在 CoreWindow 范围内的 UWP 文本框中插入选项卡?

    当我在 UWP 应用程序中有一个 TextBox 时 对我来说 奇怪的行为 在 Windows 10 中创建通用的空白应用程序 UWP 应用程序 使用以下代码将文本框添加到默认网格
  • 动态菜单创建IoC

    我想知道是否有人知道我如何创建如何使用 AutoFac 之类的东西来让我动态地允许 dll 创建自己的表单和菜单项以在运行时调用它们 所以如果我有一个 员工 dll 新入门表格 证书表格 供应商 dll 供应商详细信息来自 产品形态 在我的
  • 使用方法的状态模式

    我正在尝试使用方法作为状态而不是类来基于状态模式的修改版本来实现一个简单的状态机 如下所示 private Action
  • 在两个点之间创建一条曲线,每个点都具有标准化向量

    因此 我需要一种写入方法来在两点之间创建一条曲线 每个点都有一个指向任意方向的归一化向量 我一直在尝试设计这样一种方法 但一直无法理解数学 在这里 由于一张图片胜过一千个文字 这就是我所需要的 在图中 矢量垂直于红线 我相信向量需要进行相同
  • execlp() 系统调用输出错误

    这个非常简单的例子exec 系统调用 在这里 我试图打电话execlp 两次 但是 我没有得到例外的输出 它仅显示当前目录的第一次调用的输出 include

随机推荐

  • Log4Net、ThreadContext 和 Global.asax

    我正在开发一个 Log4Net 配置 该配置将记录所有未处理的异常 我需要根据用户将某些属性添加到每个日志条目中 我已在 Application Error 事件中按以下方式成功设置了此设置 这是我完整的 global asax Impor
  • 如何使用 Java 验证 JMS 队列是否存在?

    如何使用 Java API 检查 JMS 服务器上是否存在队列 我现在不想向队列发送或接收任何数据 只需验证队列是否存在 此外 队列可能是空的 这是我的代码示例 为了简单起见 我删除了错误处理 Connection connection n
  • 如果全部相同,获取数组中的最低值或随机值?

    我有一个像这样的数组 Array 5 gt 0 6 gt 0 密钥 5 和密钥 6 是用户 ID 两个键的值 0 是它们拥有的帖子数 我如何获得帖子最低的用户 如果有超过 1 个用户拥有相同 最低的帖子 请随机选择一个 谢谢 你需要的是mi
  • 无法将数组中的 PSCustomObjects 正确转换回 JSON

    我正在尝试将 JSON 文件提取到 Powershell 中 将 JSON 块附加到现有节点 组件 然后将 PSCustomObject 转换回 JSON 并保存文件 我正在使用的 JSON 类似于图 1 正如您在我的代码中看到的 我运行
  • 如何知道 Firebase DB 中添加了哪个新条目?

    我的应用程序分为 2 个部分 用户和管理员 管理员可以在 firebase db node 中添加 删除新项目 并将其反映到用户应用程序中 考虑一下 用户应用程序始终打开并使用以下代码更新列表 mFirebaseDatabase addVa
  • 后期预览 - 使用 AJAX 和 Fancybox 传递数据

    我正在尝试进行后期预览 它将出现在新的 Fancybox iframe 中 几周以来 我一直在寻找一些帮助或最佳实践 但我找不到 我的主要问题是将数据从表单 在更新数据库之前 传递到 Fancybox 窗口 我的 AJAX 技能很差 所以也
  • wp_dequeue_script 用于子主题替换脚本

    我有一个子主题 我可以添加我想用来替换一些主题功能并替换一些按钮的脚本 但我无法删除旧按钮 因此它们都显示在彼此之上 如何删除父js脚本 这是我的function php为儿童主题 function replace scroll Remov
  • React-Native-Web 的视频支持

    有没有在React Native Web中播放视频的解决方案 React Native Web https github com necolas react native web https github com necolas react
  • 带有整数参数的分段 numpy 函数

    我定义分段函数 def Li x return piecewise x x lt 0 x gt 0 lambda t sin t lambda t cos t 当我评估时Li 1 0 答案是正确的 Li 1 0 array 0 540302
  • 为什么测试期间的 useParams 在带有包装器的测试环境中返回未定义?

    我现在在两个不同的代码库中看到了这一点 并且感到困惑 因为它在实际浏览器中工作正常 但在测试中却不行 如果组件使用useParamshook hook在测试中抛出错误 错误 未捕获 TypeError 无法解构属性accountId 未定义
  • Android导航组件:如何获取当前导航图的id?

    我使用嵌套导航图来确定范围并在一组片段之间共享我的视图模型 我还有一个 BaseFragment 类 它获取所需视图模型的引用 fun provideViewModel VM return if viewModelScopeGraphId
  • 使用反射获取属性值时参数计数不匹配

    我得到了参数计数不匹配我不明白的错误 我有以下代码 Type target Type GetType CPS Service DocumentType Create an instance of my target class instan
  • 未定义的方法“dragonfly_accessor”

    我是 Dragonfly 的新手 并尝试浏览 Rails 主文档页面上的设置说明 不使用活动记录 我的步骤 1 添加到Gemfile gem dragonfly gt 1 0 3 2 bundle install 3 rails g dra
  • 如何正确更新 API 11 后的通知?

    Before Notification Builder http developer android com reference android app Notification Builder html应运而生更新方式 http deve
  • 如何在 linkedin 开发者应用程序中设置“r_fullprofile”访问权限?

    我在我的应用程序中应用了一个 API 来访问需要 r fullprofile 访问权限的 linkedin 推荐 在 linkdin api 升级之前 它工作正常 但现在 linkedIn 应用程序不提供设置完整配置文件访问权限 这就是我的
  • ARM 上 TLS 的代码序列

    The 线程本地存储的 ELF 处理 http www akkadia org drepper tls pdf文档给出了各种架构的各种模型 本地执行 初始执行 一般动态 的汇编序列 但 ARM 不行 有什么地方可以看到 ARM 的此类代码序
  • 使用 ColumnText 会导致“文档没有页面”异常

    我想将文本包装在图像下方 或左侧或右侧 的矩形中 如下所示 请参阅链接 http upanh in SLk http upanh in SLk 我在代码中使用 ColumnText 来换行文本 protected void doGet Ht
  • Java 8 是否提供了重复值或函数的好方法?

    在许多其他语言中 例如 Haskell 很容易多次重复一个值或函数 例如 获取值 1 的 8 个副本的列表 take 8 repeat 1 但我在Java 8中还没有找到这个功能 Java 8的JDK中有这样的功能吗 或者相当于类似范围的东
  • 内存流为空

    我需要从不同的来源 函数 生成一个巨大的 xml 文件 我决定使用XmlTextWriter因为它使用的内存比XmlDocument 首先 发起一个XmlWriter与底层MemoryStream MemoryStream ms new M
  • 如何在 .NET 4.5 中“同时”运行这两个方法?

    我有一个方法可以执行 2独立的逻辑片段 我希望我能同时运行它们同时 并且仅在这两个子方法完成后才继续 我试图弄清楚async await语法 但我就是不明白 这是代码 public PewPew SomeMethod Foo foo var