我正在尝试创建一个执行脚本块的后台作业.我需要将此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) 我正在使用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) 我正在使用nuget打包一些程序集和其他文件.
我需要将符号分开,所以我使用"nuget pack -symbols"创建两个单独的nupkg文件.
我遇到的问题是.symbols.nupkg包只包含"lib"目录(带有PDB和DLL).缺少"工具"和"内容".
这意味着当有人安装.symbols.nupkg时,他们不会在"内容"下面获得额外的文件.因为.symbols.nupkg具有与主.nupkg完全相同的包ID,所以nuget将不会安装其中包含"content"的主包.
它是同一个nuspec文件,它创建了两个包,所以我无法在那里控制它.
我做错了什么,或者误解了符号包应该如何使用?
在对包含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无法生成排序列表,这可能会导致依赖于它的代码中出现令人惊讶的行为.一旦找到问题就很容易对问题进行编码,但很难预料到,并且很可能导致错误.
排序和排序是否有充分理由以这种方式不一致?
我正在使用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) 我总是被告知在使用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内存管理器中呢?是因为有很多代码出现了这个错误并且他们不想破坏它,或者他们觉得调试内存管理器的工作不是要抓住这种错误吗?
有什么想法吗?这种滥用是否常见?