Благодаря VladD, который ответил мне в прошлый раз здесь - Проигрывание анимации из фонового потока , а также куче различных тем на других форумах, я вроде стал лучше понимать принцип работы с wpf, но с другой стороны еще больше запутался. В общем-то, моя цель все еще состоит в том, чтобы запустить анимацию из фонового потока. Теперь я точно установил, что работает код вызова анимации в фоновом потоке, но не могу понять почему. В моей программе есть вызов асинхронного метода, который делает пост-запрос и возвращает ответ:
async Task<string> PostMethod() {
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subKey);
HttpResponseMessage response;
string json;
using (ByteArrayContent content = new ByteArrayContent(Webcam.lastSnapshot)) {
content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response = await client.PostAsync(uriBase, content);
json = await response.Content.ReadAsStringAsync();
}
return json;
}
И есть функция, в которой вызывается PostMethod и сама анимация, соответственно.
async void Func() {
string json = await PostMethod();
ColorAnimation anim = new ColorAnimation();
//Здесь всякие настройки анимации
Rect.InvokeAsync(async()=>{ Rect.BeginAnimtion(SolidColorBrush.ColorProperty, anim);});
}
Если я правильно понимаю, await приостанавливает выполнение метода до тех пор, пока не выполнится асинхронный код после await. Но у меня, почему-то, в окне вывода уведомление о завершении потока приходит позже, чем вызывается метод Rect.InvokeAsync, причем секунд на 5-7. Следовательно, я могу сделать вывод, что ошибка при проигрывании анимации как-то связана с PostMethod, но я не могу понять как. Прошу помочь разобраться!
Почитайте ответ на этот вопрос Async и Await. Контекст синхронизации и выполнения.Конечный автомат. C#
У вас, судя по всему, происходит захват контекста синхронизации не UI потока, что вам не нужно.
Смотрите, сообщение о завершении потока и не должно появляться немедленно.
Task
выполняется обычно не в новом потоке, а на пуле потоков. Соответственно завершение Task
'а вовсе не означает завершение потока.
Проблему, которую сразу видно — ваша анимация создаётся в фоновом потоке, а это неправильно. Делайте так:
dispatcher.InvokeAsync(() =>
{
ColorAnimation anim = new ColorAnimation();
//Здесь всякие настройки анимации
Rect.BeginAnimation(SolidColorBrush.ColorProperty, anim);
});
Виртуальный выделенный сервер (VDS) становится отличным выбором
Здравствуйте, как правильно открывать файл в pictureBox и правильно закрывать его для перезаписывания файла
Только только начал изучать ASPNET -> пишу приложение с возможностью регистрации и входа через обычную html форму