#c# #windows-phone-8 #asynchronous #scheduled-tasks
#c# #windows-phone-8 #асинхронный #запланированные задачи
Вопрос:
Я пытаюсь создать живую плитку, которая использует данные из метода DownloadStringAsync.
protected override void OnInvoke(ScheduledTask task){
WebClient web = new WebClient();
web.DownloadStringAsync(new Uri("website"));
web.DownloadStringCompleted = web_DownloadStringCompleted;
StandardTileData data = new StandardTileData();
ShellTile tile = ShellTile.ActiveTiles.First();
data.BackContent = string;
tile.Update(data);
}
void web_DownloadStringCompleted(object sender,
DownloadStringCompletedEventArgs e)
{
string=e.result ;
} // example
строка все время возвращает значение null. Я думаю, это из-за асинхронной работы. Каким-то образом, если я смогу синхронизировать его, возможно, это сработает. есть идеи? Спасибо
Ответ №1:
У вас есть условие гонки, поскольку операция загрузки является асинхронной, переменная ‘string’ (которая, кстати, не должна компилироваться) не будет обновляться, когда вы прочитаете ее значение, чтобы установить BackContent.
Попробуйте это с ключевыми словами Async / Await:
protected async override void OnInvoke(ScheduledTask task)
{
var web = new Webclient();
var result = await web.DownloadStringTaskAsync(new Uri("website"));
StandardTileData data = new StandardTileData();
ShellTile tile = ShellTile.ActiveTiles.First();
data.BackContent = resu<
tile.Update(data);
}
Если вы не можете использовать DownloadStringTaskAsync в своем приложении WP8, попробуйте использовать TaskCompletionSource для выполнения того же, что и в примере в этом сообщении .
protected async override void OnInvoke(ScheduledTask task)
{
var result = await DownloadStringTaskAsync (new Uri("website"));
StandardTileData data = new StandardTileData();
ShellTile tile = ShellTile.ActiveTiles.First();
data.BackContent = resu<
tile.Update(data);
}
public Task<string> DownloadStringTaskAsync(Uri address)
{
var tcs = new TaskCompletionSource<string>();
var client = new WebClient();
client.DownloadStringCompleted = (s, e) =>
{
if (e.Error == null)
{
tcs.SetResult(e.Result);
}
else
{
tcs.SetException(e.Error);
}
};
client.DownloadStringAsync(address);
return tcs.Task;
}
Вот пример 1, пример 2 и пример 3 из MSDN для использования ключевого слова Async / Await с WebClient в Windows Phone 8.
Поскольку вы используете WP8, вам может потребоваться добавить пакет Nuget для ключевого слова Async / Await. просто запустите
установка-пакет Microsoft.Bcl.Async
В консоли диспетчера пакетов. Или используйте графический интерфейс Nuget для его загрузки (найдите «асинхронный»)
Комментарии:
1. привет, спасибо за ответ. для второй строки я заменил как » var result = await web. DownloadStringAsync(новый Uri («website»)); » его сообщение об ошибке не может ожидать «void» . Теперь я проверю ссылки на примеры
2. @user3343556 Пожалуйста, вызывайте DownloadStringTaskAsync, а не DownloadStringAsync 🙂