C# 调用API同步还是异步?
我正在尝试使用我在NODE.js中开发的API,我是在一个c#windows窗体桌面应用程序中完成这项工作的 API在服务器端是异步编写的,但是它可以在我的客户端内同步吗?让我解释一下我的意思 这是我正在做的一个代码示例:C# 调用API同步还是异步?,c#,api,async-await,task,desktop-application,C#,Api,Async Await,Task,Desktop Application,我正在尝试使用我在NODE.js中开发的API,我是在一个c#windows窗体桌面应用程序中完成这项工作的 API在服务器端是异步编写的,但是它可以在我的客户端内同步吗?让我解释一下我的意思 这是我正在做的一个代码示例: public static DateTime GetDateTime() { try { string result = Task.Run(() => client.GetStringAsync(client.BaseAd
public static DateTime GetDateTime()
{
try
{
string result = Task.Run(() =>
client.GetStringAsync(client.BaseAddress)).Result;
Date currentTime = JsonConvert.DeserializeObject<Date>(result);
return currentTime.Value;
}
catch (Exception ex)
{
throw ex;
}
}
根据我的研究,这是同步运行的。。。这就是我所需要的,因为在函数调用之后,我使用datetime来计算和显示人员列表的年龄
据我所知,如果我使用ASYNC/AWAIT,计算人员年龄的代码将立即执行,而我很可能还没有当前日期的值。我的假设正确吗
我是否需要在我的应用程序中运行任何异步操作,而不是在我发送电子邮件(大约需要5秒钟)并且我希望sendmail任务在后台运行,同时应用程序保持对用户的响应
最后,也是更重要的一点,上面的代码似乎有效,但。。。我这样做是使呼叫同步运行的最佳实践吗?没有僵局?谢谢你的耐心阅读,但我发现了很多帖子,老实说,我找不到所有的答案
如果问题太多,请只回答最后一个问题!:) 所以我从根本上感到困惑,我没有掌握异步/等待/任务关系。。。但现在我认为这更清楚了 我遵循advise并采用异步方式,如下链接中的示例所示: 我重写了所有类似的内容,以防有人在意:
public static async Task<DateTime>GetDateTime()
{
using (HttpClient client = new HttpClient())
{
// Omitted some code here for simplicity.
try
{
string result = await client.GetStringAsync(client.BaseAddress);
Date currentTime = JsonConvert.DeserializeObject<Date>(result);
return currentTime.Value;
}
catch (Exception ex)
{
throw ex;
}
}
}
或者,您可以在同一行代码中启动并等待任务完成:
DateTime result = await MyClass.getCurrentDate();
使用上面的方法,它看起来是同步的,但是当其他代码执行时,您并没有真正利用运行一个或多个任务的优势。单个StackOverflow问题的问题太多。不,异步并不意味着代码将在不等待调用结果的情况下继续。
var result=task.Run(()=>DoSomethingAsync()).结果代码>可能会在各种情况下导致死锁。只需在谷歌上搜索一下“同步运行异步方法”。如果你想同步运行的唯一原因是因为你认为代码会继续运行而不是等待,那么就不要这样做。它将等待,这就是等待的全部意义。只需使用异步方式,不要试图强制它同步。除非客户机
也有一个同步方法(通常是这种情况)。服务器端也不重要,它可以是同步的,也可以是异步的,客户机可以做任何它想做的事情,不管怎样。你把阻塞和并行处理混淆了,它们是不一样的thing@Liam谢谢你的链接,我看了,他们主要讨论的是等待vs等待。我想我明白你的意思了,当实际上是一个并行过程时,我说非阻塞代码是不好的,但是我在这里再次了解了更多关于这一点,谢谢你的输入。
Task<DateTime> getCurrentDate = MyClass.GetDateTime();
//Code here executes right away without waiting for the task to finish
DateTime result = await getCurrentDate;
DateTime result = await MyClass.getCurrentDate();