小编Jen*_*ens的帖子

Application.Run和Form.Load之间会发生什么?

我有一个用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)

c# vb.net app-startup winforms

13
推荐指数
2
解决办法
1575
查看次数

x86 Debug和Release版本之间的双值更改为1位

在一些数字代码中,我注意到编译为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)

.net vb.net roslyn

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

如何将一个巨大的文件分成单词?

如何从文本文件中读取一个非常长的字符串,然后处理它(拆分成单词)?

我尝试了这个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)

.net c# file-io

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

如何在图表中设置系列Z顺序

我有一个具有多个系列的Chart控件(System.Windows.Form.DataVisualisation.Charting,所以是WinForms),有些分配给主要的轴,有些分配给辅助的Y轴。

我需要图表以特定的Z顺序绘制序列(这意味着先绘制哪个序列,然后绘制第二个序列,依此类推),因为其中有些是重叠的。我找不到任何相关财产。

我认为z顺序取决于将系列添加到SeriesCollection的顺序,但这似乎并没有改变我的测试。

我想念什么吗?

PS:它不是3D图形。所以我只问不同系列的绘制顺序。

c# vb.net charts mschart

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

Pen.Dispose处理底层画笔吗?

我创建了一个新的Pen对象:

Private NewPen As New Pen(New SolidBrush(Color.FromArgb(12,52,220)))
Run Code Online (Sandbox Code Playgroud)

当我现在打电话的NewPen.Dispose时候,它还处理SolidBrush我用来制作笔的笔,或者我是否必须单独处理它?

c# vb.net gdi+

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

SQLite:ON DELETE CASCADE的性能不佳

我在我的应用程序中使用SQLite数据库来存储测量数据.

它在项目中分组.这些表与外键互连,ON DELETE CASCADE用于处理链接.数据库看起来像这样:

  • 表项目
  • 表组(外键:project_id)
  • 表文件(外键:group_id)
  • 表数据点(外键:file_id)

所有外键引用的列都声明为

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)

sql database sqlite foreign-keys

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

按进程名称取消隐藏进程?

前段时间我写了一个代码来隐藏/恢复进程窗口,我所做的是:

隐藏进程:

1) 在正在运行的进程中查找进程名称。

2) 将 MainWindowHandle 添加到容器(在本例中为字典),这对于稍后取消隐藏该过程是必要的。

3) 使用 ShowWindow API 函数隐藏进程。

取消隐藏进程:

1) 在正在运行的进程中查找进程名称。

2)从容器中检索保存的指定进程的MainWindowHandle。

3) 使用 ShowWindow API 函数取消隐藏进程。

为什么我使用字典来取消隐藏进程?嗯,因为 Hidden 进程的MainWindowHandle值为 Zero 0,所以这是我发现检索正确句柄以在ShowWindow函数中使用以恢复进程的唯一方法。

但我真的不想依赖于在隐藏进程之前Hide保存所需HWND的方法,我想通过知道如何在VB.NETC# 中仅通过指定进程名称来执行取消隐藏操作来改进这一切(例如: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)

c# vb.net winapi process winforms

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