[英]Windows phone 8 RestSharp request. Async/await
我知道已经问了很多问题,但是我的问题是,即使我实现了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构造函数时,我异步尝试从Web服务器请求数据并填充模型。 关键是,相应的视图“不等待”填充模型的请求,因此显示为空。 我用
List<AlphaKeyGroup<Deck>> DataSource
通过DataBinding填充LongListSelector。 但是,绑定时,DataSource尚未设置。 希望你能帮忙
您正在调用异步方法,而无需在构造函数中等待它。 这就是为什么“它不等待”的原因(因为它没有什么可以等待的)。
因此,在构造函数内部调用async
方法通常是一个坏主意,同时考虑到构造函数无法async
的事实。
您应该相应地重新设计解决方案。 一种选择是拥有一个async
静态方法,该方法创建一个实例并await
该过程:
public static async Task CreateInstance(bool local)
{
var model = new DecksViewModel();
if (local)
{
await InitializeLocalDeckList();
}
else
{
await Dereffering();
}
}
那将允许您不使用仅在UI甚至处理程序中使用的async void
。
您可以在Stephen Cleary的博客中了解其他选项的更多信息
您正在使用async void ,这意味着没有人会等待。 只是失火而忘记 。
我在这里的async关键字中看到一些误解:如果使用await,您的代码将仅等待async方法的结果。 否则,该调用将仅启动async方法,但您不知道它何时真正运行。
但是,您不能在构造函数中使用await。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.