显示用于同步方法调用的ProgressRing(或使同步方法异步运行)

时间:2019-10-10 21:21:39

标签: c# multithreading uwp progress-bar uwp-xaml

我有一个UWP应用程序,该应用程序显示GIF的框架,并允许用户添加和删除框架。此类操作会重新计算GIF,并在与“添加框架”和“删除框架”按钮相同的页面上向用户显示GIF。

删除框架的过程可能需要一段时间。在此期间,页面/窗口冻结,并且用户无法执行任何操作,但这尚未使他受益。

我考虑过使用一个运行的ProgressRing,当用户单击“删除框架”按钮时,长时间运行后进度环应该消失。

因此我将其添加到页面底部:

<ProgressRing x:Name="PrgrMain" />

按钮单击方法如下:

private void BtnRemoveSelectedFrame_Click(object sender, RoutedEventArgs e)
{
    if (LvGifFrames.SelectedItems != null)
    {
        PrgrMain.IsActive = true;
        GifInformation.RemoveFrames(LvGifFrames.SelectedItems.Cast<GifFrameInformation>().ToList());
        PrgrMain.IsActive = false;
    }
}

这不起作用。进度环似乎仅适用于异步方法调用,例如,当我将代码更改为以下内容时,我看到该环出现了五秒钟:

private async void BtnRemoveSelectedFrame_Click(object sender, RoutedEventArgs e)
{
    if (LvGifFrames.SelectedItems != null)
    {
        PrgrMain.IsActive = true;
        await Task.Delay(5000);
        PrgrMain.IsActive = false;
    }
}

但是我目前删除帧的方法是同步的。在此方法内部,我从集合中删除框架。页面的某些控件必定会显示集合中的框架以及生成的GIF图像,因此当我添加/删除框架时,UI线程肯定已经涉及到。

我试图将我的“ RemoveFrames”代码封装在Task.Run()中,并使该方法与此异步,但是这产生了一个错误,该错误是接口被调入另一个线程。我也怀疑这是一种干净的方法,但是我不确定从这里去哪里。

有什么想法吗?

1 个答案:

答案 0 :(得分:-1)

您可以将Windows Community Toolkit加载控件用作页面忙指示器。 https://docs.microsoft.com/en-us/windows/communitytoolkit/controls/loading