小编Joh*_*ntu的帖子

隐晦的第三种错误

我们从小就听过有关 PowerShell 的两种错误的故事:终止错误和非终止错误。

描述非终止错误的是它只是将输出输出到错误流并允许脚本继续执行。但是,它不能被 try/catch 捕获,因为实际上没有“抛出”异常。

对于终止错误,它会将错误输出到错误流,并且如果未处理,则完全停止脚本的运行,从而防止执行发生错误的行以下的任何内容。它可以通过 try/catch 捕获。

然而,似乎存在第三种类型的错误,我似乎无法找到有关该错误的信息或名称。

这是一种介于终止错误和非终止错误之间的错误...生成时,它不会终止脚本,从而赋予其非终止错误的属性,但可以通过try/catch,这给了它终止错误的属性!

这是最基本的错误类型。它是 .NET 本身直接引发的异常,而不是由 PowerShell 的函数或 cmdlet 引发的。

几个例子:

  • 除以 0。
  • 使用错误的参数调用对象的方法 - 可能是错误的参数类型(PowerShell 无法自动强制)、错误的参数数量等... - 示例:'a'.Split([object[]])

问题是,它们叫什么?为什么它们与其他两种类型不同?该对象仍然是 ErrorRecord,而不是 Exception,因此它们实际上应该表现得像终止错误或非终止错误,而不是两者的突变。

powershell

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

FileStream.Read() - 读取字节

FileStream.Read()返回读取的字节数,但是...除了到达文件末尾之外,是否还有其他情况,它读​​取的字节数少于请求的字节数并且不会抛出异常

文档说:

Read 方法仅在到达流末尾后返回零。否则,Read 在返回之前始终从流中读取至少一个字节。如果调用 Read 时流中没有可用数据,则该方法将阻塞,直到至少返回一个字节的数据。即使尚未到达流的末尾,实现也可以自由地返回比请求更少的字节。

但这并不能完全解释在什么情况下数据将不可用并导致该方法阻塞直到它可以再次读取。我的意思是,大多数数据不可用的情况不应该强制例外吗?

在什么情况下,将读取的字节数与预期字节数进行比较可能会有所不同(假设当我们提到预期字节数时我们已经在检查文件末尾)?

编辑:更多信息,我问这个的原因是因为我遇到了一些代码,开发人员几乎做了这样的事情:

bytesExpected = (remainingBytesInFile > 94208 ? 94208 : remainingBytesInFile
while (bytesRead < bytesExpected)
{
      bytesRead += fileStream.Read(buffer, bytesRead, bytesExpected - bytesRead)
}
Run Code Online (Sandbox Code Playgroud)

现在,我根本看不到拥有这个 while 的任何优势,如果它无法读取预期的字节数,我希望它会抛出异常(记住它已经考虑到有那么多剩余读取字节数)

发生这样的事情可能有什么原因呢?我确信我错过了一些东西

.net c#

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

不要在子项目上关闭ToolStripDropDownButton Checked

我有一个ToolStripDropDownButton子项CheckOnClick启用的地方.

我想给用户关闭下拉前挑选多个项目的能力,但我找不到这样做没有设置的方式AutoClosefalse和这样做了另外一个问题,这是怎么关闭它,当用户单击控件外的任何位置(即应该关闭它的时间).

我已经看到类似的问题如何关闭设置为autoclose = false的toolstripmenuitem?但是Click在每个组件上放置事件处理程序的建议并不完全是我所追求的.无论是通过鼠标还是键盘控制,都应该失去焦点.

我查看了Leave但是当ToolStrips本身有那个事件时,显然ToolStripDropDownButton没有.

最好的方法是什么?

.net c# winforms toolstripdropdown

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

Application.DoEvents vs在循环中等待Task.Delay

令我不满的是,我需要在我的一个应用程序中使用WebBrowser控件.

我还需要做的一件事是等待元素变为可见/类更改/等,这在DocumentCompleted事件被触发后很好地发生,使得事件在我的情况下接近无用.

所以目前我有类似......

while (webBrowser.Document?.GetElementById("id")?.GetAttribute("classname") != "class")
{
    Application.DoEvents();
    Thread.Sleep(1);
}
Run Code Online (Sandbox Code Playgroud)

现在我已经阅读了多个DoEvents()邪恶的地方并且可能会导致很多问题,所以我考虑用Task.Delay()这样的方式替换它:

while (webBrowser.Document?.GetElementById("id")?.GetAttribute("classname") != "class")
{
    await Task.Delay(10);
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,除了明显的事实,Thread.Sleep()意志阻止1ms的事件,并且Task.Delay()在上面的例子中有一个更大的延迟设置,这两种方法之间的实际差异是什么,这更好,为什么?

PS:请坚持这个问题,虽然我不一定会想到如何WebBrowser通过使用别的东西来解决控制问题本身的其他想法(想到js注入),这不是回答这个问题的地方,这个问题是关于这两位代码如何不同,哪些会被认为更好.

c# multithreading task doevents async-await

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

使用NodaTime从字符串创建时间偏移量

我有一个字符串代表特定客户的偏移量.一个例子是UTC+1:00.它总是相对于UTC的偏移量,因此字符串将始终以后UTC+-然后是格式的偏移量开始hh:mm.

问题是,如何获取此字符串并将其转换为偏移量?我不想要一个带有偏移量的日期和时间对象,我只想要一个象征着我的偏移的对象,然后我可以将其应用于日期,这完全是不同的.

在标题上说,我正在寻找使用NodaTime.

.net c# datetime nodatime

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

如何像使用DataGridView.DataSource一样使用List <Dynamic>?

我正在尝试将a绑定List<dynamic>到DataGridView DataSource属性.虽然编译时没有错误,但也没有显示任何列.

如果我预先创建列,我会显示要显示的行,但它们中没有数据.

简单地说,如何List<dynamic>在DataGridView中正确使用对象?

.net c# datagridview dapper

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