我正在尝试使用在NODE.js中开发的API,我是通过c#Windows Forms桌面应用程序执行此操作的。
API在服务器端写为ASYNC,但可以在客户端内部同步吗?让我解释一下我的意思。
这是我正在做的代码示例:
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 currentDate = GymAPI.GetDateTime();
根据我的研究,它是同步运行的……这正是我所需要的,因为在函数调用之后,我使用datetime来计算并显示人员列表的年龄。
据我了解,如果我使用ASYNC / AWAIT,那么计算人员年龄的代码将立即执行,而我很可能还没有当前日期的值。我对这个假设是正确的吗?
除了发送电子邮件(大约需要5秒钟)时,我是否需要在我的应用程序中运行任何ASYNC,并且我希望sendmail任务在后台运行,同时应用程序仍对用户做出响应?
最后,更重要的是,上面的代码似乎可以工作,但是...我的方法是使调用同步运行的最佳实践吗?没有僵局?感谢您的耐心阅读,但是我发现了很多帖子,老实说我找不到所有答案。
如果有太多问题,请仅回答最后一个! :)
答案 0 :(得分:-1)
所以我从根本上感到困惑,我没有掌握ASYNC / AWAIT / TASK的关系...但是现在我想更加清楚了。
我遵循了advice并遵循此链接内的示例进行了ASYNC方式:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/
我改写了这样的东西,以防有人在意:
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;
}
}
}
基本上,您可以运行任务ASYNC,因此,当您调用函数GetDateTime()时,您将开始运行任务,而不会像下面这样阻止执行以下代码:
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();
使用上面的方法,它看起来是同步的,但是在执行其他代码时,您并没有真正利用运行一个或多个任务的优势。