我现在正在学习异步(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());
任何援助都会受到很大的影响。谢谢。
答案 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)
异步代码确实会感染整个代码库。您可以与Task.Wait同步运行任务。不建议这样做。您也可以使用Task.Run将其发送到后台线程,但当然,您无法轻松检索任何结果。
答案 2 :(得分:0)
如果你不想让调用方法异步,那么下面会做
List<User> users = User.getUsers().Result;