调用Asyc Task <t>方法

时间:2016-05-06 18:38:38

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

我现在正在学习异步(UWP)方法,并且不能完全理解语法。除了Task异步调用之外,所有示例还有很多其他内容,并且没有真正展示它们如何启动。我不了解的主要内容是如何从非异步方法启动任务。每当我尝试调用任务时,它都希望我将该方法转换为异步方法。反过来又希望我将任何调用该方法的方法转为异步。那你怎么开始呢?

我正在尝试的当前用例是从UWP localstorage中检索一个充满用户名和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();

我尝试过像这样运行任务,但我不认为我的sytax是对的

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

任何援助都会受到很大的影响。谢谢。

3 个答案:

答案 0 :(得分:6)

  

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

正如我在异步最佳实践文章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

答案 1 :(得分:2)

Async Best Practices MSDN

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

答案 2 :(得分:0)

如果你不想让调用方法异步,那么下面会做

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