小编Sta*_*ish的帖子

在 DownloadProgressChanged 事件期间从 DownloadFileAsync 缓慢更新我的事件处理程序

我的问题

我正在编写一个 PowerShell 脚本,需要从远程 Web 服务器下载几个大文件,然后才能继续执行其他任务。我的项目要求之一是显示每次下载的进度,以便最终用户知道发生了什么。

对另一个 SO 问题的回复包含一个使用注册事件和 Net.WebClient.DownloadFileAsync 的解决方案。但是,当我在接受的答案中尝试解决方案时,下载在我的脚本处理所有 DownloadProgressChanged 事件之前很久就完成了。

我试过的

我创建了一个测试脚本,我在下面提供了该脚本以重现问题并尝试隔离它发生的位置。起初我认为问题在于 Write-Progress cmdlet 很慢,所以我将其替换为 Write-Host 以显示完成的百分比。这产生了许多具有相同百分比值的重复行。考虑到 Write-Host 也可能很慢,我将事件处理程序的操作更改为仅在更改时输出百分比。这没有任何区别。

我在输出中注意到,在事件处理程序指示下载已完成几个百分点之前,下载已完成。最初的几个百分点有很大的延迟,然后它加速了。但是即使在下载完成后,完成百分比的输出仍然很慢。我对脚本进行了另一次修改,以显示每次百分比变化所用的时间。

我的环境是使用 PowerShell 2.0 的 Windows 7 和 Server 2008。我已经在两个操作系统上尝试过该脚本,结果相同。我没有使用 PS 配置文件,Server 2008 计算机是全新安装的。

这是我的测试脚本。

# based on /sf/answers/344910681/
$client = New-Object System.Net.WebClient
$url=[uri]"https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2"
$file="$env:USERPROFILE\Downloads\linux-2.6.18.tar.bz2"

try {
    Register-ObjectEvent $client DownloadProgressChanged -action {     
        if ( $eventargs.ProgressPercentage -gt $percent ) {
            $percent = $eventargs.ProgressPercentage
            if ( $start_time -eq $null ) {
                $start_time = $(get-date)
            }
            # Get the elapsed …
Run Code Online (Sandbox Code Playgroud)

powershell events event-handling

6
推荐指数
1
解决办法
1552
查看次数

检测系统时钟是否改变?

我正在研究一个Java项目的概念,该项目可以检测计算机时钟何时被更改.想法是在计算机时钟上记录日期和时间并将其存储在文件中.然后,我希望能够在其上运行规则,如果时钟已更改,则显示消息.我也在考虑合并诸如"允许不超过5分钟的更改"等规则.这是为了方便将时间改变为奇数分钟.

我还需要结合时钟所做的更改.例如,在一年中的某些时间(英国时间)前进一小时或后退一小时.

我不确定是否已经有一个Java系统可以实现这一点,但我确实不知道从哪里开始.

java

5
推荐指数
1
解决办法
4533
查看次数

设计桌面应用

我创建了一个桌面应用程序 是否有任何书籍或网站上有设计桌面应用程序的示例?

user-interface desktop-application

5
推荐指数
1
解决办法
8095
查看次数

如何填写多列列表框

我知道如何创建列表框但是我在填写多列列表框时遇到了一些问题.我该怎么做?

c# listbox winforms

4
推荐指数
1
解决办法
2万
查看次数

Perl内部和Moose:恒定折叠优化

我一直对Perl执行的常量折叠优化感到好奇,但是当代码中有Moose涉及的机会是不会执行常量折叠时(如果我错了请纠正我).

我有Moose代码,其中包含如下方法:

sub foo {
    my ($self) = shift;
    my $test_y = $self->pos->[1];
    #...
    if ($self->is_map_val($self->pos->[0]+8, $test_y+32) ||
        $self->is_map_val($self->pos->[0]+32-8, $test_y+32)) { 
    {
        heavy_stuff();
    }
    #...
}
Run Code Online (Sandbox Code Playgroud)

当我运行时,perl -MO=Deparse ./program.pl我得到几乎相同的代码行:

if ($self->is_map_val($self->pos->[0] + 8, $test_y + 32) or    
    $self->is_map_val($self->pos->[0] + 32 - 8, $test_y + 32)) 
{
    heavy_stuff();
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么Perl没有优化32-824?是否有任何真正的原因Perl没有这样做(也许Moose子系统让生活变得更难?).

如果它有帮助,我运行Perl(v.5.14.2)

perl internals moose constantfolding

4
推荐指数
1
解决办法
220
查看次数

如何在AngularJS中删除货币符号

任何人都可以告诉如何删除AngularJS中的货币符号吗?

value = $filter('currency')(value);
Run Code Online (Sandbox Code Playgroud)

我得到一个美元符号.我想删除它.

angularjs

4
推荐指数
3
解决办法
9917
查看次数

C#中的非托管C++类

我可以从C#代码实例化和"使用"非托管C++类(比如使用DllImport等)吗?

c# c++ unmanaged managed

3
推荐指数
1
解决办法
499
查看次数

SQL Server备份到远程服务器

我意识到有一个命令:

BACKUP DATABASE [DB Name] TO DISK [PATH]
Run Code Online (Sandbox Code Playgroud)

是否可以备份到远程位置? - EG Web服务器而不是数据库服务器?

sql sql-server

2
推荐指数
1
解决办法
7276
查看次数

Nagios身份验证

我想知道我是否可以将Nagios验证为LDAP,如果答案对这个问题是肯定的.我能以什么方式做到这一点?

nagios

1
推荐指数
1
解决办法
8210
查看次数

使用以下格式的Perl时间:20130527

我正在寻找一种在Perl中生成以下内容的不太长的方法:

获取当前时间(月,日和年)的代码的一部分.例如,如果我们在2013年5月27日,那么输出应该是20130527

我现在认为,如果我们使用"本地时间",就像

$date_str = localtime;
Run Code Online (Sandbox Code Playgroud)

输出格式为:Wed Jul 18 07:24:05 2001还有其他特殊变量可用吗?

perl

0
推荐指数
2
解决办法
557
查看次数