【发布时间】:2016-12-08 07:26:32
【问题描述】:
我试图在运行Parallel.Foreach 时更新进度条,但在执行过程中没有任何反应。进度条仅在 For 循环结束时更新。我怎样才能使这段代码工作?
XAML
<StackPanel>
<Grid x:Name="LoadProgressGrid" Height="100"
Visibility="Visible">
<ProgressBar x:Name="LoadProgress"
Maximum="100"
Minimum="1" />
<TextBlock Margin="0,0,0,-5"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="16"><Run Text="Import Progress"/></TextBlock>
</Grid>
<Button Height="35" Width="100" Margin="0,10" Content="Test" Click="Test_Click"/>
</StackPanel>
C#
private void Test_Click(object sender, RoutedEventArgs e)
{
decimal current=0;
List<string> lst = new List<string>();
lst.Add("Foo");
lst.Add("Foo");
lst.Add("Foo");
lst.Add("Foo");
decimal max = 100000;
var uiFactory = new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext());
Parallel.ForEach(lst, (data) =>
{
for (int i = 0; i < max; i++)
{
// Use the uiFactory above:
// Note the need for a temporary here to avoid closure issues!
current = current + 1;
uiFactory.StartNew( () => LoadProgress.Value = (double)(current/max)*100);
}
});
MessageBox.Show("Done!");
}
【问题讨论】:
-
您确定 LoadProgress.Value 是小数而不是整数?
-
如果您希望 UI 真正能够做事,请不要阻塞 UI 线程。
-
你不是为了不使用闭包而创建一个临时的,实际上并不涉及你创建一个临时的;你只是继续使用闭包
-
Parallel.ForEach是一个阻塞动作,直到循环结束才会返回。
标签: c# wpf parallel.foreach taskscheduler