Windows phone 8 个 RestSharp 请求。 Async/await
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 构造函数时,我异步尝试从网络服务器请求数据并填充模型。
关键是,填充模型的请求对应的视图"doesn't wait",所以它显示为空。
我用
List<AlphaKeyGroup<Deck>> DataSource
通过 DataBinding 填充 LongListSelector。但是 DataSource 在绑定时尚未设置。
希望能帮到你
您正在调用一个异步方法,而没有在构造函数中等待它。这就是为什么 "it doesn't wait"(因为它没有什么可等待的)。
由于这个原因,再加上构造函数不能 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 偶数处理程序中使用。
中阅读更多关于其他选项的信息
您正在使用 async void,这意味着没有人会等待它。只是 即刻忘记。
我发现这里的 async 关键字存在一些误解:
如果您使用 await,您的代码将只等待异步方法的结果。否则那个调用只会启动异步方法,但你不知道它什么时候真正会 运行.
但是您不能在构造函数中使用 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 构造函数时,我异步尝试从网络服务器请求数据并填充模型。 关键是,填充模型的请求对应的视图"doesn't wait",所以它显示为空。 我用
List<AlphaKeyGroup<Deck>> DataSource
通过 DataBinding 填充 LongListSelector。但是 DataSource 在绑定时尚未设置。 希望能帮到你
您正在调用一个异步方法,而没有在构造函数中等待它。这就是为什么 "it doesn't wait"(因为它没有什么可等待的)。
由于这个原因,再加上构造函数不能 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 偶数处理程序中使用。
您正在使用 async void,这意味着没有人会等待它。只是 即刻忘记。
我发现这里的 async 关键字存在一些误解: 如果您使用 await,您的代码将只等待异步方法的结果。否则那个调用只会启动异步方法,但你不知道它什么时候真正会 运行.
但是您不能在构造函数中使用 await。