weixin_45840746 2024-03-21 20:20 采纳率: 35.6%
浏览 41
已结题

阻塞问题:c#运行程序时wpf上的GIF停止加载了

我xaml上加载了一个GIF
.cs上在将一个ppt转成图片并获取bitmap,在运行过程中,GIF总是停止,等到图片全部转成后才又开始加载,该怎么解决哎


            foreach (Slide slide in presentation.Slides)
            {
                foreach (Shape shape in slide.Shapes)
                {
                    if (shape.HasTextFrame == MsoTriState.msoTrue && shape.TextFrame.HasText == MsoTriState.msoTrue)
                    {
                        var textRange = shape.TextFrame.TextRange;
                        foreach (TextRange run in textRange.Runs())
                        {
                            var font = run.Font;
                            uniqueFonts.Add(font.Name);
                            if (font.Name != "Arial" && !slidesWithNonArialFontList.Contains(slide))
                            {
                                slidesWithNonArialFontList.Add(slide);
                                string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Data\\inspect\\typeface");
                                await ConvertToBitmapImage(slide, path);
                                imageCollection.typefaceSlideImages.Add(new TypefaceSlideImage{ Slide = slide ,ImagePath = path });
                            }
                        }
                    }
                }             
            }

private async Task ConvertToBitmapImage(Slide slide, string thumbnailDirectory)
        {
            string thumbnailPath = Path.Combine(thumbnailDirectory, $"{Guid.NewGuid()}.png");
            await Task.Run(() => slide.Export(thumbnailPath, "PNG", 320, 240));
        }
  • 写回答

13条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-21 20:20
    关注

    引自免费微信小程序:皆我百晓生

    在WPF应用程序中,GIF动画可能由于UI线程被长时间阻塞而暂停加载。从您的代码片段来看,ConvertToBitmapImage方法使用了Task.Run异步执行PPT转图片的操作,但该操作仍然会消耗CPU资源,并且如果处理时间过长,仍可能导致UI线程无法及时更新界面。

    为了解决这个问题,您可以尝试以下策略:

    1. 将转换任务放在后台线程池中执行,并确保每次转换完成后都回到UI线程来更新显示GIF的控件。您可以使用Dispatcher.InvokeDispatcher.BeginInvoke将工作项调度回主线程。
    private async Task ConvertToBitmapImage(Slide slide, string thumbnailDirectory)
    {
        string thumbnailPath = Path.Combine(thumbnailDirectory, $"{Guid.NewGuid()}.png");
        
        await Task.Run(() => 
        {
            slide.Export(thumbnailPath, "PNG", 320, 240);
            
            // 回到UI线程更新GIF控件
            Application.Current.Dispatcher.BeginInvoke(new Action(() =>
            {
                // 这里假设imageControl是你的GIF图像控件
                imageControl.InvalidateVisual(); // 强制重绘控件
                // 或者如果你有特定的方法刷新GIF,请调用相应方法
            }));
        });
    }
    
    1. 如果转换过程非常耗时,可以考虑采用增量更新的方式,比如每转换完一定数量的幻灯片就回到UI线程进行一次刷新。

    2. 确保在循环之外对GIF控件启用异步绘制模式(如果支持的话),这样即使UI线程忙于其他计算,GIF也能继续播放。

    3. 如果条件允许,优化PPT转图片的性能,比如通过并行处理多个幻灯片转换以减少单个任务的执行时间。

    请根据实际情况调整上述方案。同时,由于没有具体的UI和GIF控件代码,以上建议可能存在一定的假设成分,请您结合实际应用进行调整。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月25日
  • 创建了问题 3月21日

悬赏问题

  • ¥30 模拟电路 logisim
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价