填充datagridview而不锁定表单

时间:2013-08-11 18:49:37

标签: multithreading powershell

使用PowerShell和Windows窗体,我有一个带有datagridview的应用程序,我正在尝试填充它。为了举例,我们的代码如下:

    $button1_Click={
    For ($i = 0; $i -lt 100000; $i++)
    {
        $datagridview1.Rows.Add($i.ToString())
    }

在for指令运行期间(在我的计算机上这个特定示例大约需要13秒),表单显然会被锁定。

我基本上试图找到一种方法来使datagridview在不锁定表单的情况下不断更新。我不在乎是否需要更长时间才能运行,只要表格可用即可。

这是我尝试过的:

  • Start-Job,但由于Start-Job无法直接与我的datagridview交互,我需要等待作业完成,以便我可以检索结果然后将其添加到datagridview。这样做会涉及一个Wait-Job,它会在Wait-Job运行时锁定表单。

  • Register-ObjectEvent,但在使用Windows窗体时,这不能正常工作。

  • 看着使用背景工作者,但意识到在Powershell中不可能

1 个答案:

答案 0 :(得分:0)

实现此目的的一种方法是使用[Windows.Forms.Application]::DoEvents()。每次循环都不需要调用它。比如说每5000次迭代,或者你可以按时完成。也许自上次调用DoEvents以来已经过了250毫秒:

$button1_Click = {
    for ($i = 0; $i -lt 100000; $i++) {
        $datagridview1.Rows.Add($i.ToString())
        if ($i % 5000 -eq 0) { [Windows.Forms.Application]::DoEvents() }
    }
}