Запуск анимации из фонового потока(2)

223
17 марта 2018, 15:14

Благодаря 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, но я не могу понять как. Прошу помочь разобраться!

Answer 1

Почитайте ответ на этот вопрос Async и Await. Контекст синхронизации и выполнения.Конечный автомат. C#

У вас, судя по всему, происходит захват контекста синхронизации не UI потока, что вам не нужно.

Answer 2

Смотрите, сообщение о завершении потока и не должно появляться немедленно.

Task выполняется обычно не в новом потоке, а на пуле потоков. Соответственно завершение Task'а вовсе не означает завершение потока.

Проблему, которую сразу видно — ваша анимация создаётся в фоновом потоке, а это неправильно. Делайте так:

dispatcher.InvokeAsync(() =>
    {
        ColorAnimation anim = new ColorAnimation();
        //Здесь всякие настройки анимации
        Rect.BeginAnimation(SolidColorBrush.ColorProperty, anim);
    });
READ ALSO
Использование Firebase в c#

Использование Firebase в c#

Как можно моментально отправлять данные в FireBase?

237
Разбор async await [дубликат]

Разбор async await [дубликат]

На данный вопрос уже ответили:

255
C# Как освободить ресурсы из Picturebox?

C# Как освободить ресурсы из Picturebox?

Здравствуйте, как правильно открывать файл в pictureBox и правильно закрывать его для перезаписывания файла

245
ASP.NET Сore 2.0 действие по умолчанию

ASP.NET Сore 2.0 действие по умолчанию

Только только начал изучать ASPNET -> пишу приложение с возможностью регистрации и входа через обычную html форму

198