调用API同步还是异步?

时间:2019-04-15 05:41:09

标签: c# api async-await task desktop-application

我正在尝试使用在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任务在后台运行,同时应用程序仍对用户做出响应?

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

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

1 个答案:

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

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