我知道它被要求很多,但我的问题是,我的方法不会等待请求完成,尽管我已经实现了一个TaskCompletionSource,它应该完成这项工作,但它没有。
public DecksViewModel(bool local)
{
DList = new List<Deck>();
if (local)
InitializeLocalDeckList();
else
{
Dereffering();
}
}
public async void Dereffering()
{
var e = await InitilaizeWebDeckList();
List<DeckIn> decksIn = JsonConvert.DeserializeObject<List<DeckIn>>(e);
foreach (DeckIn d in decksIn)
{
Deck dadd = new Deck();
dadd.CardCount = 0;
dadd.Name = d.name;
dadd.PicturePath = d.image;
dadd.InstallDirectory = false;
DList.Add(dadd);
}
DataSource = AlphaKeyGroup<Deck>.CreateGroups(DList, System.Threading.Thread.CurrentThread.CurrentUICulture, (Deck s) => { return s.Name; }, true);
}
public Task<String> InitilaizeWebDeckList()
{
var tcs = new TaskCompletionSource<string>();
var client = new RestClient("blabla.com");
var request = new RestRequest("");
request.AddHeader("Authorization", "Basic blabla");
client.ExecuteAsync(request, response =>
{
test = response.Content;
tcs.SetResult(response.Content);
});
return tcs.Task;
}因此,当我调用DecksViewModel构造函数时,我会异步地尝试从when服务器请求数据并填充模型。关键是,对应的视图“不等待”请求填充模型,因此显示为空。我用
List<AlphaKeyGroup<Deck>> DataSource 通过LongListSelector填充DataBinding。但是当DataSource被绑定时,它还没有被设置。我希望你能帮上忙
发布于 2015-01-20 10:51:57
您正在调用一个异步方法,而没有在构造函数中等待它。这就是为什么“它不等待”(因为它没有什么可等待的)。
由于这个原因,在构造函数中调用async方法通常是个坏主意,再加上构造函数不能是async的事实。
您应该相应地重新设计您的解决方案。一个选项是拥有一个async静态方法,该方法创建一个实例,并使await的过程:
public static async Task CreateInstance(bool local)
{
var model = new DecksViewModel();
if (local)
{
await InitializeLocalDeckList();
}
else
{
await Dereffering();
}
}这将允许您不使用async void,它只应该在UI甚至处理程序中使用。
您可以在斯蒂芬·克利里的博客中阅读更多有关其他选项的内容。
发布于 2015-01-20 10:56:54
您正在使用异步空,这意味着没有人会等待它。它只是火和忘记。
我在这里看到了异步关键字中的一些误解:如果使用wait,您的代码只会等待异步方法的结果。否则,该调用将只启动异步方法,但您不知道它何时实际运行。
但是,不能在构造函数中使用await。
https://stackoverflow.com/questions/28043297
复制相似问题