我有一个用 C# 编写的课程。在其中,我想在列表上并行运行某个函数。在每个项目完成后,我想更新一个进度条。但是,我从我的程序中得到了非常奇怪的行为。它执行事件并到达我的子程序,但从未继续实际执行任何代码。相反,它只是冻结。(我混合了 vb.net 和 c#。它会在某个时候被重写)
所以在我的 Windows 窗体中,我调用
progressBar.Visible = True
progressBar.Value = 0
progressBar.Maximum = dataGrid.SelectedRows.Count
AddHandler quoteManager.refreshStarted, AddressOf progressBarCounter
quoteManager.refreshAllAsync(list)
事件很简单
Private Sub progressBarCounter()
Me.Invoke(Sub()
If progressBar.Value = progressBar.Maximum Then
progressBar.Visible = False
Else
progressBar.Value += 1
End If
End Sub)
End Sub
在报价管理器类中我定义了这个。
public event Action refreshStarted;
public void refreshAllAsync(List<BindableQuote> bindableQuotes)
{
bindableQuotes.AsParallel()
.WithDegreeOfParallelism(10)
.ForAll((quote) => {
quote.refreshAll();
if (refreshStarted != null) { refreshStarted(); }
});
}
所以出于某种原因,我让它在列表中的每个项目上输入progressBarCounter,但它永远不存在。相反,它只是保持表单冻结。