小编ben*_*ben的帖子

如何将脚本块作为start-job中的参数之一传递

我正在尝试创建一个执行脚本块的后台作业.我需要将此scriptblock作为参数传递,但我似乎无法使语法工作.脚本块正在转换为沿途的某个字符串.

当我将脚本块传递给本地函数时,它工作正常,但不是通过启动作业

以下语法有效:

function LocalFunction
{
    param (
        [parameter(Mandatory=$true)]
        [ScriptBlock]$ScriptBlock
    )

    &$ScriptBlock | % { echo "got $_" }
}

LocalFunction -ScriptBlock { echo "hello" }
Run Code Online (Sandbox Code Playgroud)

这按预期输出"得到你好".

但是以下失败了:

$job = start-job -argumentlist { echo "hello" } -scriptblock {
    param (
        [parameter(Mandatory=$true)]
        [ScriptBlock]$ScriptBlock
    )
    &$ScriptBlock | % { echo "got $_" }
}
start-sleep -s 1
receive-job $job
Run Code Online (Sandbox Code Playgroud)

它返回的错误是

Receive-Job : Cannot process argument transformation on parameter 'ScriptBlock'. Cannot convert the " echo "hello" " value of type "System.String" to type …
Run Code Online (Sandbox Code Playgroud)

powershell

16
推荐指数
2
解决办法
3万
查看次数

是Observable.Interval对高频事件有用吗?

我正在使用Observable.Interval来测试特定的客户端/服务器代码在不同负载下的执行情况.

但它似乎有一些奇怪的行为.

  • Observable.Interval(timespan = 0)尽可能快地产生事件,例如每秒800万个事件.这似乎没问题.
  • Observable.Interval(0 < timespan < 1ms) 只产生1个事件,然后什么都没有.
  • Observable.Interval(1ms <= timespan) 以大约所请求的速率产生事件,量化很多,最多只有64个事件/秒.

我可以理解它不一定使用下面的高分辨率计时器,但令人困惑的是它在三个区域中具有完全不同的行为.

这是预期的行为,还是我使用它错了?如果它是预期的,那么是否有一个替代Observable.Interval来模拟Rx中的高频事件源,或者我应该自己滚动......?

一个演示行为的简短程序如下:

static void Main(string[] args)
{
    const int millisecsPerTest = 10000;

    var intervals = new[]
    {
        TimeSpan.FromTicks(0),          // 0 -> rate of 8M messages per second
        TimeSpan.FromTicks(1000),       // 0.1ms -> rate of 0
        TimeSpan.FromTicks(20000),      // 2ms -> rate of 64 messages per second (not 500 as expected)
        TimeSpan.FromTicks(1000000),    // 100ms -> rate of 9 messages per second
    };

    foreach(var interval in intervals) …
Run Code Online (Sandbox Code Playgroud)

c# system.reactive

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

带符号的nuget包缺少"content"目录

我正在使用nuget打包一些程序集和其他文件.

我需要将符号分开,所以我使用"nuget pack -symbols"创建两个单独的nupkg文件.

我遇到的问题是.symbols.nupkg包只包含"lib"目录(带有PDB和DLL).缺少"工具"和"内容".

这意味着当有人安装.symbols.nupkg时,他们不会在"内容"下面获得额外的文件.因为.symbols.nupkg具有与主.nupkg完全相同的包ID,所以nuget将不会安装其中包含"content"的主包.

它是同一个nuspec文件,它创建了两个包,所以我无法在那里控制它.

我做错了什么,或者误解了符号包应该如何使用?

nuget

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

Seq.sort和Seq.sortBy对含有NaN的浮子序列的行为不一致

在对包含NaN的浮点序列进行排序时,Seq.sort将NaN放在结果的开头:

> [ 0.0; nan; 1.0; nan; -1.0 ] |> Seq.sort
val it : seq<float> = seq [nan; nan; -1.0; 0.0; ...]
Run Code Online (Sandbox Code Playgroud)

但是,Seq.sortBy似乎失败了,只是传递序列,未分类.据推测这是因为NaN违反了基本的排序原则.

> [ 0.0; nan; 1.0; nan; -1.0 ] |> Seq.sortBy id
val it : seq<float> = seq [0.0; nan; 1.0; nan; ...]
Run Code Online (Sandbox Code Playgroud)

没有抛出异常,这可能表明sortBy无法生成排序列表,这可能会导致依赖于它的代码中出现令人惊讶的行为.一旦找到问题就很容易对问题进行编码,但很难预料到,并且很可能导致错误.

排序和排序是否有充分理由以这种方式不一致?

f#

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

Get-Content -Wait在读取文件时锁定文件,阻止Add-Content写入数据

我正在使用powershell来编写和读取日志文件.

一个脚本正在使用Add-Content生成日志文件.另一个脚本是使用Get-Content -Wait来拖尾日志文件.这看起来应该非常可靠.

然而,作者经常无法写作,而读者经常无法阅读和放弃.我只能假设这两个命令没有用适当的访问标志打开文件,所以他们互相争斗.

这是一个令人讨厌的小脚本,它演示了同一进程中两个作业的问题,尽管在不同的PowerShell进程之间也是如此:

$writer = start-job -ScriptBlock {     
    foreach($i in 1..500)
    {
        "$i" | Add-Content "c:\temp\blah.txt"
        Sleep -Milliseconds 10
    }
}

$reader = start-job -ScriptBlock { 
    Get-Content "c:\temp\blah.txt" -wait
}

while($writer.State -eq "Running")
{
    Sleep 1
}
Sleep 2

"Checking writer"
receive-job $writer

"Checking reader"
receive-job $reader

remove-job $writer -force
remove-job $reader -force
Run Code Online (Sandbox Code Playgroud)

在使用PowerShell 3 ISE的Windows 7 x64计算机上,我通常会遇到大量写入错误:

Checking writer
The process cannot access the file 'C:\temp\blah.txt' because it is being used by another process.
    + CategoryInfo          : …
Run Code Online (Sandbox Code Playgroud)

powershell powershell-3.0

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

以错误的方式删除数组

可能重复:
如何将new []与delete配对可能只会导致内存泄漏?

我总是被告知在使用new []分配的数组上调用delete是不安全的.你应该总是将new与delete和new []与delete []配对.

所以我很惊讶地发现以下代码在VS2008下的Debug和Release模式下编译并运行正常.

class CBlah
{
public:
    CBlah() : m_i(0) {}

private:
    int m_i;
};

int _tmain(int argc, _TCHAR* argv[])
{
    for(;;)
    {
        CBlah * p = new CBlah[1000]; // with []
        delete p;                    // no []
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我花了一段时间才弄清楚它为什么会起作用,我认为这只是运气和一些未定义的行为.

但是......它让我想知道......为什么Visual Studio没有选择这个,至少在Debug内存管理器中呢?是因为有很多代码出现了这个错误并且他们不想破坏它,或者他们觉得调试内存管理器的工作不是要抓住这种错误吗?

有什么想法吗?这种滥用是否常见?

c++ memory-management

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