.net 同步方法调用异步方法假死

最近使用.net core 开发了一个项目,具体就不说了跟项目本身无关。先上一段代码

  

//示例代码
//前端调用方法
public string GetName()
{
  return GetUserName().Result;
}
//服务端实现
public async Task<string> GetUserName()
{
   var userModel=await GetUserModel();
   return userModel.Name;
}

public async Task<UserModel> GetUserModel()
{
   数据库查询
}

很简单的代码对吧,就是一个查询数据库返回用户名称。

然并卵.....

程序每次执行到

var userModel=await GetUserModel();

这句代码时候就进入假死状态,由于我测试是使用控制台程序,而控制台程序无法重现这个问题,还把调用方给批了一通。囧
经过千山万水的查找后,根据dudu这篇文章https://www.cnblogs.com/dudu/p/9860959.html脑中灵光一闪,难道是~~好吧,真的是。
在同步方法中调用async异步方法导致程序假死。具体为什么会造成这个现象,我还没搞懂(哈哈,打我啊)。解决办法就是在代码中进行了一次中转,
代码如下

//前端调用方法
public string GetName()
{
  return Task.Factory.StartNew(async () =>
  {
    return await GetUserName();
  }).Result;
}

原文地址:https://www.cnblogs.com/guozhongxiang/p/10297626.html

时间: 2024-10-17 08:57:36

.net 同步方法调用异步方法假死的相关文章

async await 同步方法调用异步方法死锁

同步方法调用异步方法.GetAwaiter().GetResult()计算函数超时,异步方法所有的回调操作都会期望返回到主线程. 所以会导致各种线程死锁.异步方法中使用ConfigureAwait(false)解决 1 public void Check(){ //todo 2 //验证userid和token是否匹配 3 var tUserId = UserIdAndTokenValidationAsync(userId, at.UserId); 4 //验证参数签名是否正确 5 Task<b

生产环境项目问题记录系列(二):同步方法调用异步方法

描述一下问题背景,公司部分项目还在使用老三层框架,存在跨库join的情况,在服务化的改造过程中,这些跨库join的老三层从都要被换成对应的服务接口. 目前有个项目通过sql访问了C端产品组的三张表,并且时跨库join,对方开发组要回收表的访问权,所有sql访问的都要改成接口访问. C端产品组提供的服务接口为.Net Core的Api接口,异步(.net core里HttpClient已经不再提供同步访问了).而这边调用的是一个老三层架构的定时任务,需要在同步方法里调用异步接口.当然你会问为什么不

winform 利用 多线程 处理窗体假死,利用 Invoke BeginInvoke 处理子线程调用 UI 控件报错的问题

因为工作需要自己写了一个简单的工具软件,数据库查询每日OA未发送成功流程的日志记录以及批量重处理操作. 开始使用的是单线程,后台查询数据库的时候窗体假死,使用多线程很简单就能解决. private void btnQuey_Click(object sender, EventArgs e) { this.button2.Enabled = false; Thread connectionThread = new Thread(new ThreadStart(connectDB)); connec

Powershell使用 OpenFileDialog类 假死问题解决。

我创建了一个打开文件的函数.代码内容: function Openfile {   Add-Type -AssemblyName System.Windows.Forms   $openfile = New-Object System.Windows.Forms.OpenFileDialog   $openfile.Filter = '图片|*.jpg|All Files|*.*'   $openfile.InitialDirectory = "C:\ManageOperate\Staff Ph

[转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理

china_xuhua 原文地址 1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线 程,如果不采用多线程控制进度条,窗口很容易假死(无法适时看到进度信息).下面我就简单结合一个我写的例子给大家做一个介绍. 第一步:设计界面,注意需要引用 using System.Threading; 控件名称分别为: progressBar1:label1:textBox1:button1: 第二

C# 解决窗体假死的状态

异步调用是CLR为开发者提供的一种重要的编程手段,它也是构建高性能.可伸缩应用程序的关键.在多核CPU越来越普及的今天,异步编程允许使用非常少的线程执行很多操作.我们通常使用异步完成许多计算型.IO型的复杂.耗时操作,去取得我们的应用程序运行所需要的一部分数据.在取得这些数据后,我们需要将它们绑定在UI中呈现.当数据量偏大时,我们会发现窗体变成了空白面板.此时如果用鼠标点击,窗体标题将会出现”失去响应”的字样,而实际上UI线程仍在工作着,这对用户来说是一种极度糟糕的体验.如果你希望了解其中的原因

ios开发笔记----exc_bad_access(code=1, address=0x789870)野指针错误,假死debug状态

错误原因: exc_bad_access(code=1, address=0x789870)野指针错误,主要的原因是,当某个对象被完全释放,也就是retainCount,引用计数为0后.再去通过该对象去调用其它的方法就会出现野指针错误. 例如: Person *jerry = [[Person alloc]init];  //  retainCount引用计数为1 [jerry eat];  //  调用吃的方法 [jerry release];  //  释放jerry这个对象到 retain

多线程操作UI控件——DataGridView假死现象

在多线程编程中,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也 给大家带来很多不便. 今天我就遇到了一个类似的问题,对DataGridView指定 DataSource 来填充数据,更新数据的时候,会导致DataGridView出现假死,显示错误或者滚动条无法显示的问题,在保证了DataGridView的ScrollBars设置为了Both,数据量大于DataGridView显示的的范围,而且没有冻结列

C# winform窗体假死

C#  winform窗体假死 我们经常会遇到当执行一个比较大的函数时,窗体会出现假死的现象,给用户的体验不是很好,于是我们遇到了问题,那么就必须解决,我们该如何解决呢,首先在自己的脑里画个问号,接下来我们就一起研究吧! 先分析,这个问题是如何出现的呢!为什么会出现,如何避免出现,避免不了的,如何解决等,下面我们就去解决问题吧,遇到问题不要怕,解决问题是我们成长最快的时候,曾经别人告诉我,不怕不会做,就怕想不到.那我们就进入正题吧! 窗体假死是如何出现的呢? 在调用    testc();函数时