在我的代码中,我将运行一个进程并检索部分标准错误输出(一个数字)以引发一个发送进度数字的事件。
有时我在“.First”方法的这一行有一个异常,因为字符串没有要分割的东西:
out = mp3gain_For_NonTag.StandardError.ReadLine.Trim.Split("%").First
问题是我想在不执行 Try/Catch 的情况下添加必要的检查以避免该异常,因为在我的速度测试中我注意到此过程中的 try/catch 会大大降低性能。
我想简化执行必要检查但不捕获任何异常的代码(到目前为止,我添加的检查将比 try/catch 执行得更快)。
代码如下:
Private Shared Sub Run_MP3Gain_NotTag()
mp3gain_For_NonTag.Start() ' Run process
Dim out as string = mp3gain_For_NonTag.StandardError.ReadToEnd
While Not mp3gain_For_NonTag.HasExited
If Not String.IsNullOrEmpty(out) Then
' This would generate numbers between 1 to 100
out = mp3gain_For_NonTag.StandardError.ReadLine.Trim.Split("%").First
End If
If Integer.TryParse(out, 0) Then
RaiseEvent MP3Gain_Progress(out)
End If
End While
RaiseEvent MP3Gain_Exited()
End Sub
...关于其他信息,这是我不想做的示例,我可以说在修改后的代码中添加一个 try catch,即使没有捕获任何异常类型也会降低性能很多:
Private Shared Sub Run_MP3Gain_NotTag()
mp3gain_For_NonTag.Start() ' Run process
Dim out as string = mp3gain_For_NonTag.StandardError.ReadToEnd
While Not mp3gain_For_NonTag.HasExited
Try
out = mp3gain_For_NonTag.StandardError.ReadLine.Trim.Split("%").First
RaiseEvent MP3Gain_Progress(out)
Catch : End Try
End While
RaiseEvent MP3Gain_Exited()
End Sub
最佳答案
我认为.FirstOrDefault()这里可能就是您的答案。
又看了一眼。我不认为你的问题是第一种方法。 First 抛出的异常是一个症状。您的问题是您通过读取到流的末尾来设置 out
,然后您通过尝试读取另一行来运行 Split,这将不返回任何内容,因此出现异常。只需拆分 out
,一切都应该没问题:
Dim out as string = mp3gain_For_NonTag.StandardError.ReadToEnd
While Not mp3gain_For_NonTag.HasExited
If Not String.IsNullOrEmpty(out) Then
' This would generate numbers between 1 to 100
out = out.Trim.Split("%").First()
End If
关于.net - 简化字符串异常检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19281528/