我有一个用VB.NET for Framework 4.5编写的WinForms应用程序.我注意到应用程序的启动时间非常长(我编写的其他应用程序在启动时几乎立即启动更多工作,此应用程序需要> 5秒)启动时间在多次启动后不会改变,所以我猜在第一次启动应用程序时,不是未缓存的CLR代码的情况.
我在启动时写下了一些测试:
Module modMain
Public MyLog As System.Text.StringBuilder
<STAThread>
Public Sub Main()
MyLog = New System.Text.StringBuilder
Application.EnableVisualStyles()
Application.SetCompatibleTextRenderingDefault(False)
MyLog.AppendLine("Before run: " & Date.Now.ToString & "," & Date.Now.Millisecond.ToString)
Application.Run(frmMain)
End Sub
End Module
Run Code Online (Sandbox Code Playgroud)
Sub Main()
是应用程序的入口点.它运行frmMain
,我控制的第一个真正的东西是Sub InitializeComponent()
,由设计师生成:
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
MyLog.AppendLine("Init Start: " & Date.Now.ToString & "," & Date.Now.Millisecond.ToString)
'All the control initializations
MyLog.AppendLine("Init End: " & Date.Now.ToString & "," & Date.Now.Millisecond.ToString)
End Sub
Run Code Online (Sandbox Code Playgroud)
最后我到达了这个Form.Load
活动
Private Sub frmMain_Load(sender As …
Run Code Online (Sandbox Code Playgroud) 在一些数字代码中,我注意到编译为x86或使用AnyCPU +"Prefer 32-bit"时的调试和发布版本给出了不同的结果.我已经将我的代码分解为几乎无法重现问题的最低限度.事实证明,在其中一个计算步骤中只有1位发生了变化.
代码:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim tau = 0.000001
Dim a = 0.5
Dim value2 = (2 * Math.PI * 0.000000001 * tau) ^ a * Math.Sin(a * (Math.PI / 2))
RichTextBox1.Text = BitConverter.DoubleToInt64Bits(value2).ToString
End Sub
Run Code Online (Sandbox Code Playgroud)
在Int64中,Debug构建给出4498558851738655340
,Release构建给出4498558851738655341
(注意最后一位数).
我尝试在调试版本中手动启用优化(同样也是DEBUG常量和pdb生成),但结果保持不变.仅将完整构建类型更改为Release会更改结果.
更进一步,我试图比较Telerik的JustDecompile给出的IL:
调试版本:
.method private instance void Button1_Click (
object sender,
class [mscorlib]System.EventArgs e
) cil managed
{
.locals init (
[0] float64 V_0,
[1] float64 V_1,
[2] float64 V_2, …
Run Code Online (Sandbox Code Playgroud) 如何从文本文件中读取一个非常长的字符串,然后处理它(拆分成单词)?
我尝试了这个StreamReader.ReadLine()
方法,但是我得到了一个OutOfMemory
例外.显然,我的线条非常长.这是我读取文件的代码:
using (var streamReader = File.OpenText(_filePath))
{
int lineNumber = 1;
string currentString = String.Empty;
while ((currentString = streamReader.ReadLine()) != null)
{
ProcessString(currentString, lineNumber);
Console.WriteLine("Line {0}", lineNumber);
lineNumber++;
}
}
Run Code Online (Sandbox Code Playgroud)
以及将行分为单词的代码:
var wordPattern = @"\w+";
var matchCollection = Regex.Matches(text, wordPattern);
var words = (from Match word in matchCollection
select word.Value.ToLowerInvariant()).ToList();
Run Code Online (Sandbox Code Playgroud) 我有一个具有多个系列的Chart控件(System.Windows.Form.DataVisualisation.Charting,所以是WinForms),有些分配给主要的轴,有些分配给辅助的Y轴。
我需要图表以特定的Z顺序绘制序列(这意味着先绘制哪个序列,然后绘制第二个序列,依此类推),因为其中有些是重叠的。我找不到任何相关财产。
我认为z顺序取决于将系列添加到SeriesCollection的顺序,但这似乎并没有改变我的测试。
我想念什么吗?
PS:它不是3D图形。所以我只问不同系列的绘制顺序。
我创建了一个新的Pen对象:
Private NewPen As New Pen(New SolidBrush(Color.FromArgb(12,52,220)))
Run Code Online (Sandbox Code Playgroud)
当我现在打电话的NewPen.Dispose
时候,它还处理SolidBrush
我用来制作笔的笔,或者我是否必须单独处理它?
我在我的应用程序中使用SQLite数据库来存储测量数据.
它在项目中分组.这些表与外键互连,ON DELETE CASCADE
用于处理链接.数据库看起来像这样:
所有外键引用的列都声明为
project_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT
.
外键是这样声明的
FOREIGN KEY(project_id) REFERENCES Projects(project_id) ON DELETE CASCADE
现在我有1个项目,项目中有1个组,该组中有800个文件,每个文件大约有60个数据点.
删除组合DELETE FROM Groups WHERE project_id=1
效果很好,但需要大约21秒,这对我的需求来说太长了.
我已将删除包装在一个Transaction中.
我是SQL和SQLite的极端新手.这个持续时间是正常的还是有办法加快速度?我需要删除该组以填写更新的值.在我的应用程序中,我只想将一个项目保留在内存中,所以只需删除整个数据库并从头开始填充它(虽然快得多,~1 sek)并不是一个真正的选择.
这些表是这样创建的:
'Create projects table
cmd.CommandText = "CREATE TABLE IF NOT EXISTS Projects ( ProjectID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, " & _
"name TEXT NOT NULL, comment TEXT, date DATETIME2, diameter FLOAT(53), thickness FLOAT(53) );"
'Create Groups table
cmd.CommandText &= vbNewline …
Run Code Online (Sandbox Code Playgroud) 前段时间我写了一个代码来隐藏/恢复进程窗口,我所做的是:
隐藏进程:
1) 在正在运行的进程中查找进程名称。
2) 将 MainWindowHandle 添加到容器(在本例中为字典),这对于稍后取消隐藏该过程是必要的。
3) 使用 ShowWindow API 函数隐藏进程。
取消隐藏进程:
1) 在正在运行的进程中查找进程名称。
2)从容器中检索保存的指定进程的MainWindowHandle。
3) 使用 ShowWindow API 函数取消隐藏进程。
为什么我使用字典来取消隐藏进程?嗯,因为 Hidden 进程的MainWindowHandle
值为 Zero 0
,所以这是我发现检索正确句柄以在ShowWindow
函数中使用以恢复进程的唯一方法。
但我真的不想依赖于在隐藏进程之前Hide
保存所需HWND的方法,我想通过知道如何在VB.NET或C# 中仅通过指定进程名称来执行取消隐藏操作来改进这一切(例如:cmd.exe ) 之前不保存MainWindowHandle
,这可能吗?
我展示了代码(在 VB.NET 中),让您了解我为 HideProcess 方法所做的工作:
但请注意,此代码与问题并不完全相关,我的问题是如何仅通过指定进程名称来取消隐藏隐藏的进程,以避免下面编写的代码需要检索保存的句柄以取消隐藏进程。
' Hide-Unhide Process
'
' Usage Examples :
'
' HideProcess(Process.GetCurrentProcess().MainModule.ModuleName)
' HideProcess("notepad.exe", Recursivity:=False)
' HideProcess("notepad", Recursivity:=True)
'
' UnhideProcess(Process.GetCurrentProcess().MainModule.ModuleName)
' UnhideProcess("notepad.exe", Recursivity:=False) …
Run Code Online (Sandbox Code Playgroud)