如何 运行 方法中的 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
}
我知道这一定是没有正确使用 async
、await
和 Task
的问题,但我还不能让它工作。任何人都可以帮助我提供有关如何完成此操作的提示吗?
您的 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++;
}
}
我在单独的 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
}
我知道这一定是没有正确使用 async
、await
和 Task
的问题,但我还不能让它工作。任何人都可以帮助我提供有关如何完成此操作的提示吗?
您的 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++;
}
}