【问题标题】:Calling an Asyc Task<T> method调用异步任务<T> 方法
【发布时间】:2016-05-07 03:29:06
【问题描述】:

我现在正在学习异步 (UWP) 方法,无法完全理解语法。所有的例子都不仅仅是任务异步调用,并没有真正展示它们是如何启动的。我不明白的主要事情是如何从非异步方法启动任务。每次我尝试调用任务时,它都希望我将该方法转换为异步方法。这反过来又希望我将任何调用该方法的方法变为异步。那你应该怎么开始呢?

我正在尝试的当前用例是从 UWP 本地存储中检索一个包含用户名和 Id 的 JSON 文件,该文件现在在 UWP 中是一个异步调用。我很确定我的方法是正确的,但我在调用它时遇到了问题。目前我在它支持的页面后面的代码中调用该方法,实际方法当前驻留在用户类中。

这是我的代码:

public async Task<List<User>> getUsers()
    {
        List<User> u = new List<User>();
        StorageFolder folder = ApplicationData.Current.LocalFolder;
        StorageFile file = await folder.GetFileAsync("LocalUsers.txt");
        string Json = await FileIO.ReadTextAsync(file);
        List<User> existingUsers = new List<User>();
        existingUsers = JsonConvert.DeserializeObject<List<User>>(Json);
        return existingUsers;
    }

这就是我试图从后面的代码中调用方法的方式

    List<User> users = await User.getUsers();

我也尝试过像这样运行任务,但我认为我的语法不正确或其他什么

    Task t = new Task(User.getUsers());

我们将不胜感激任何帮助。谢谢。

【问题讨论】:

  • 为什么不按照推荐使用消费方法async
  • 这可能是我将来会做的事情,但似乎异步会越来越深入到代码中,我认为这不是正确的做法,但正如其他人所指出的那样这其实是正确的方法。

标签: c# async-await win-universal-app task windows-10-universal


【解决方案1】:

我不明白的主要是如何从非异步方法启动任务。每次我尝试调用任务时,它都希望我将该方法转换为异步方法。这反过来又希望我将任何调用该方法的方法变为异步。那你应该怎么开始呢?

正如我在我的异步最佳实践文章 async does "grow" through the code base 中所描述的。这是自然的,应该被接受。尤其是在 UWP 等平台上,blocking on asynchronous code can easily cause deadlocks 还会让您立即取消应用商店的资格。

在最简单的情况下,async 的增长会在异步事件处理程序(async void)处停止。如果你在做基于 MVVM 的开发,还有其他的考虑;我在async MVVM development 上的三部分 MSDN 文章系列中介绍了这些内容。

如果你有一个现有的代码库,你也可以找到我的article on brownfield async helpful

【讨论】:

  • 虽然不是我希望的答案,但从长远来看,这可能是我需要的答案,谢谢。
【解决方案2】:

Async Best Practices MSDN

异步代码确实倾向于感染整个代码库。您可以使用 Task.Wait 同步运行任务。虽然不建议这样做。您也可以使用 Task.Run 将其发送到后台线程,但当然,您无法轻松检索任何结果。

【讨论】:

  • 根据您的文章,我应该一直使用异步吗?非异步的方法呢?我可以将非异步代码作为异步运行吗?
  • @evilsushi 您可以在异步方法中运行同步代码,是的。如前所述,您可以使用 Task.Run 在线程池上启动一个线程,并将异步任务与同步任务分段。
  • 感谢您提供的信息,我将不得不更多地阅读这篇文章并找出最好的方法。
【解决方案3】:

如果你不想让调用方法异步,那么下面就可以了

List<User> users = User.getUsers().Result;

【讨论】:

  • 不要调用.Result,而是使用await
  • OP 不想像上面描述的那样使方法异步,所以不要等待
猜你喜欢
  • 2015-03-08
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 2018-07-03
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
相关资源
最近更新 更多