从二进制数据中重复设置image.source

时间:2014-06-05 12:20:53

标签: c# windows-store-apps windows-store

我使用以下命令将图像设置为字节数据。但是,在第一次调用后,图像不再响应数据而发生变化。

public async void SetImageFromByteArray(byte[] data)
    {
        using (InMemoryRandomAccessStream raStream =
            new InMemoryRandomAccessStream())
        {
            using (DataWriter writer = new DataWriter(raStream))
            {
                // Write the bytes to the stream
                writer.WriteBytes(data);

                // Store the bytes to the MemoryStream
                await writer.StoreAsync();

                // Not necessary, but do it anyway
                await writer.FlushAsync();

                // Detach from the Memory stream so we don't close it
                writer.DetachStream();
            }

            raStream.Seek(0);

            BitmapImage bitMapImage = new BitmapImage();
            bitMapImage.SetSource(raStream);
            GameScreen.Source = bitMapImage;
            await raStream.FlushAsync();
        }
    }

另外,我希望每个人能够运行这个功能" x"毫秒,但我还没有办法做到这一点。

1 个答案:

答案 0 :(得分:0)

在没有看到其余代码的情况下无法确定,但如果重复调用此函数,那么您可能不会从UI线程进行后续调用,这会在创建/访问BitmapImage时导致异常, UI图像源。必须从UI线程调用这些调用。在Dispatch调用中包含最后几行代码:

        await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
        {
           BitmapImage bitMapImage = new BitmapImage();
           bitMapImage.SetSource(raStream);
           GameScreen.Source = bitMapImage;
           await raStream.FlushAsync();
        });

这将确保这些调用在UI线程上运行。

对于问题的计时器部分,有几个选项。我不是使用计时器的忠实粉丝所以我可能会创建一个带有简单循环的线程,这个循环在调用之间休眠:

            Task.Run((async () =>
            {
                while(!stop)
                {
                   byte [] data = GetNextImageBytes();
                   await SetImageFromByteArray(data);
                   await Task.Delay(2000);
                }
            });