我有一个异步方法:

public async Task<bool> ValidateRequestAsync(string userName, string password)
{
    using (HttpClient client = new HttpClient())
    {
        HttpResponseMessage response = await client.GetAsync(url);
        string stringResponse = await response.Content.ReadAsStringAsync();

        return bool.Parse(stringResponse);
    }
}

我这样调用此方法:

bool isValid = await ValidateRequestAsync("user1", "pass1");

我可以在不使用await关键字的情况下从同步方法调用相同的方法吗?

例如:

public bool ValidateRequest(string userName, string password)
{
    return ValidateRequestAsync(userName, password).Result;
}

我认为这会导致僵局.

EDIT

像上面这样调用方法会使调用永远不会结束.(该方法不再达到终点)

推荐答案

如果从单线程执行上下文(如UI线程)调用异步方法,并同步等待结果,则死锁的可能性很高.在你的例子中,这个概率是100%

想想看.你打电话时会发生什么

ValidateRequestAsync(userName, password).Result

您可以调用方法ValidateRequestAsync.在那里调用ReadAsStringAsync.结果是任务将返回到UI线程,并计划在UI线程变为可用时继续在UI线程上执行.但当然,它永远不会变得可用,因为它正在等待(阻塞)任务完成.但是任务无法完成,因为它正在等待UI线程变为可用.僵持不下.

有很多方法可以避免这种僵局,但它们都是一个坏主意.为了完整起见,以下方法可能有效:

Task.Run(async () => await ValidateRequestAsync(userName, password)).Result;

这是一个坏主意,因为你仍然阻止你的UI线程等待,什么都不做.

那么解决方案是什么呢?一路异步.UI线程上的原始调用方可能是某个事件处理程序,因此请确保它是异步的.

Asp.net相关问答推荐

在Docker Windows中,ASP.NET核心容器在自定义端口8080上运行,但ASP.NET容器在固定端口80上运行

使用 aspnet core SignalR 客户端为 VSIX 项目.

授权错误错误 400:C# 上的 redirect_uri_mismatch

在 ASP.Net 中使用自定义 RoleProvider 时如何允许多个角色查看页面

使用进程外会话状态的 ASP.NET 应用程序中的 SQL Server 连接问题

cookie 存储在系统的什么位置?

是否可以在没有那些 .svn 文件夹的情况下从 subversion 签出文件?

使用会话变量有多安全 - asp.net / c#

使用 C# 和 ASP.NET 从 Gmail/Hotmail/Yahoo 导入通讯簿

iOS 8 / Safari 8 不适用于 ASP.NET AJAX 扩展

这两种方法有什么区别?

什么是实体框架中的复杂类型以及何时使用它?

解析器错误:无法创建类型

通过 ASP.NET/C# 使用 Plupload

ASP .NET 单例

ASP.NET 身份,需要强密码

当用户在文本框中按 Enter 键时执行按钮单击事件

使 WCF Web 服务与 GET 请求一起工作

ASP.NET MVC3 局部视图命名约定

POST 字符串到 ASP.NET Web Api 应用程序 - 返回 null