当前位置: 首页 > 知识库问答 >
问题:

使用await task.run()的Asyc方法从不“完成”

姬安志
2023-03-14
public async Task SomeAsyncMethod()
{
   DoSomeStuff();
   await Task.Run(() => {
     DoSomeSyncStuff();
     DoSomeOtherSyncStuff();
   });
   var someDebugVariable = "someDebugValue";
}
public void CallerMethod()
{
   Task t = SomeAsyncMethod();
   t.Wait();
}

t.wait()从未完成。此外:如果我在SomeDebugVariable的赋值处放置一个断点,它永远不会被命中。

我可以添加doSomeSyncStuffdoSomeOtherSyncStuff确实完成了它们应该做的事情,通过它们进行调试告诉我它们都完成了。

为了证明我的观点,我这样修改了我的方法,结果仍然是一样的。

public async Task SomeAsyncMethod()
{
   DoSomeStuff();
   await Task.Run(() => {
     /*
     DoSomeSyncStuff();
     DoSomeOtherSyncStuff();
     */
     var a = 2; var b = 3; var c = a + b;
   });
   var someDebugVariable = "someDebugValue";
}

该应用程序是WPF应用程序。调用者线程是UI线程。

我在这里漏掉了什么?

共有1个答案

马德宇
2023-03-14

wait()调用会导致死锁,也会使异步调用变得毫无意义。我相信如果你把代码更改为

await Task.Run(() => {
// ...
}).ConfigureAwait(false);

您可以修复死锁并让代码继续进行,但实际上应该去掉t.wait()调用。任何需要对同步函数调用的结果执行的操作都应该在等待的任务之后执行,而不是在调用异步函数之后执行。

更深入地说:当任务运行时,task.wait()将阻止主线程上的所有执行。当await任务完成时,它试图marshall返回主线程,但主线程被阻塞!因为A在等待B,B在等待A,所以会出现死锁。

 类似资料:
  • 1和2都是有效的,因为没有标准化的行为,由媒体类型决定如何处理它。这感觉不对,因为PUT不是从属于资源本身,而是替换资源。 请记住,我不是在问什么是正确的,什么是有意义的。我在问哪一个是标准支持的。

  • 所以我在ReactJS中做了一个排序可视化。 我有一个名为“bubblesort”的方法,它将遵循气泡排序算法对数组进行排序。 我有一个数组生成并在屏幕上可视化,名为“array”。 现在当我使用 它将对数组进行排序,并在每次加载页面时自动更改可视化数组。它不是我想要的,我想让它对数组进行排序,并在我单击按钮时改变可视化。所以我又做了一个这样的方法 并像这样调用按钮,它将对数组进行排序,但屏幕上的

  • 本文向大家介绍javascript使用数组的push方法完成快速排序,包括了javascript使用数组的push方法完成快速排序的使用技巧和注意事项,需要的朋友参考一下 排序的方法有很多,本节介绍的是使用数组的push方法完成快速排序

  • 如果我有一个长时间运行的 方法,我在 操作方法中调用它而不等待它,是否保证即使从操作方法返回之后它也会完成? 示例: 编辑: 在谷歌搜索时,我确实发现了如何在C#中安全调用异步方法而无需等待,但我想知道是否有人能具体说明一下ASP.NET MVC。当仔细查看问题中的所有答案时,以下答案/链接中有一些信息:https://stackoverflow.com/a/15523793/585968,如@m

  • 从DB获取数据,Room DAO有一个返回Flowable userDao.getInfo()的方法,这个Flowable永远不会完成,我测试了添加doOnNext()它会发出5次(DB包含5个项目),但永远不会调用完成,但我需要因为我有toList(),什么可能是这个的替代方案 我已经测试过了,即使我只用userD替换userDatas()ao.allUserDatas()(我确信它存在于DB中

  • 本文向大家介绍JSP使用JDBC完成动态验证及采用MVC完成数据查询的方法,包括了JSP使用JDBC完成动态验证及采用MVC完成数据查询的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JSP使用JDBC完成动态验证及采用MVC完成数据查询的方法。分享给大家供大家参考。具体如下: 一、目标: ① 掌握JDBC链接数据库的基本过程; ② 掌握使用JDBC进行数据查询。 二、主要内容: ①