在没有等待#2的情况下调用异步方法

我有一个异步方法:

public async Task 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; } 

我认为这会导致僵局。

编辑

调用上面的方法会使调用永远不会结束。 (该方法不再到达终点)

如果从单线程执行上下文(如UI线程)调用异步方法,并等待同步结果,则死锁的可能性很高。 在您的示例中,该概率为100%

想一想。 你打电话会发生什么

 ValidateRequestAsync(userName, password).Result 

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

有办法防止这种僵局,但它们都是一个坏主意。 为了完整起见,以下可能有效:

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

这是个坏主意,因为你仍然阻止你的UI线程等待并且没有任何用处。

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

你可以使用return ValidateRequestAsync(userName,password).GetAwaiter()。GetResult();