繁体   English   中英

调用 API 同步还是异步?

[英]Calling an API sync or async?

我正在尝试使用我在 NODE.js 中开发的 API,我正在从 ac# windows 窗体桌面应用程序执行此操作。

API 是在服务器端异步编写的,但它可以在我的客户端内部同步吗? 让我解释一下我的意思。

这是我正在做的代码示例:

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();

根据我的研究,这是同步运行的……这就是我需要的,因为在函数调用之后,我使用日期时间来计算和显示人员列表的年龄。

据我了解,如果我使用 ASYNC/AWAIT,计算人员年龄的代码将立即执行,而我很可能还没有当前日期的值。 我在这个假设中正确吗?

除了发送电子邮件时(大约需要 5 秒),我是否需要在我的应用程序中运行任何 ASYNC 并且我希望 sendmail 任务在后台运行,同时应用程序保持对用户的响应?

最后,更重要的是,上面的代码似乎可以工作,但是......我这样做的方式是使调用同步运行的最佳实践吗? 没有死锁? 感谢您耐心阅读本文,但我找到了很多帖子,老实说我找不到所有答案。

如果问题太多,请只回答最后一个! :)

所以我从根本上感到困惑,我没有掌握 ASYNC/AWAIT/TASK 的关系......但现在我认为更清楚了。

我遵循了建议并按照此链接中的示例采用了 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;
                }

            }
        }

基本上,您可以运行 Tasks 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();

使用上面的方法,它看起来是同步的,但您并没有真正利用在其他代码执行时运行一个或多个任务的优势。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM