如何 运行 方法中的 ProgressBar 与其他方法

How to run a ProgressBar within a method with other methods

我在单独的 UI 线程中实现 ProgressBar 时遇到问题...

我的程序中有很多方法,我想在其中启动和停止进度条。

因此,我在我的 UI 中放置了一个 UI 组件 ProgressBar 并为其制作了一个模型,当 called/used 在我的模型中独立时,它(绑定后)工作正常 类(我不在代码后面工作)。 当我将我的 Progress 模型 属性 设置为不确定然后调用其他一些方法时,问题就出现了:整个过程同步进行,进度条仅在退出 main 方法的最后才移动。

这是我想要实现的示例:

public void MyMethod1()
{
    StartProgress();

    NormalSubMethod1();
    NormalSubMethod2();
    (...)

    EndProgress();
}

public void MyMethod2()
{
    StartProgress();

    NormalSubMethod5();
    (...)

    EndProgress();
}

这是我的 StartProgress() 的样子,我尝试过但没有成功:

public async void StartProgress()
{
    //Task.Run(() => { Progress.IsIndeterminate = true; });

    //await Task.Run(() => Progress.IsIndeterminate = true); // starts moving
}

public async void StopProgress()
{
    Progress.IsIndeterminate = false; // stops moving
}

我知道这一定是没有正确使用 asyncawaitTask 的问题,但我还不能让它工作。任何人都可以帮助我提供有关如何完成此操作的提示吗?

您的 NormalSubMethod-s 本身应该是 异步的 。以下是它如何工作的示例。请看这里async/await是如何使用的

XAML

<StackPanel>
    <ProgressBar
        x:Name="progress"
        Width="100"
        Height="30"/>
    <Button Content="Button"
            Width="60"
            Height="30" Click="Button_Click"
            />
    <TextBlock 
        TextWrapping="Wrap" 
        x:Name="textBlock" />
</StackPanel>

代码

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        StartProgress();
        await MyMethod();
        StopProgress();
    }

    private async Task MyMethod()
    {
        textBlock.Text += "MyMethod start" + Environment.NewLine;
  
        await Task.Delay(3000); // here we are imitating the real work
  
        textBlock.Text += "MyMethod end" + Environment.NewLine;
    }

    public void StartProgress()
    {
        progress.IsIndeterminate = true;
        textBlock.Text += "StartProgress" + Environment.NewLine;
    }

    public void StopProgress()
    {
        progress.IsIndeterminate = false;
        textBlock.Text += "StopProgress" + Environment.NewLine;
    }

编辑

您还可以将现有的同步方法 Task.Run 包装成 运行 异步。

    private async Task MyMethod()
    {
        textBlock.Text += "MyMethod start" + Environment.NewLine;
        await Task.Run(() => NormalSubMethod1());
        textBlock.Text += "MyMethod end" + Environment.NewLine;
    }

    private void NormalSubMethod1()
    {
        long n = 0;
        for (var i = 0; i < 1e9; i++)
        {
            n++;
        }
    }