我的数据记录软件在导出过程中/之后在某些机器上卡住。在正常使用期间,主窗体正在记录数据。如果用户想要将该数据导出到电子表格,他们将按照步骤打开一个新表格。在关闭窗体之前,此窗体也会保持焦点。新表单具有选择要导出的数据集的选项。选择数据集后,用户点击导出按钮。代码很长,但我会尽量总结一下。
Private Sub Exoprt_btn_Click(ByVal...)
Dim fs As FileStream = Nothing
Dim fw As StreamWriter = Nothing
Dim ...
在这个 SQL 东西恰好填充文件之后。这似乎可以正常工作,因为文件总是打开并正确填充。
在代码的最后我们有
fw.Close()
fs.Close()
fw.Dispose()
fs.Dispose()
System.Diagnostics.Process.Start(FileName)
此时,当代码运行时,电子表格将打开,用户可以根据需要保存或关闭。处理完新文件后,他们可以返回弹出窗口,选择要导出的新数据或关闭窗口并使用主窗体。
但是当软件死机时,在返回到数据记录程序时,数据导出表单通常是空白的,有时按钮和标签等对象会部分加载。导出窗口仍保持焦点,但主窗体仍在随着新数据的记录而更新。尝试关闭导出窗口会导致窗口不响应对话。重新启动计算机显示后台中的所有内容都按预期工作,除了无法与窗口的功能进行交互。
我试图通过在 sleep 时间和短信中写入来识别恶意代码。
fw.Close()
label1.text = "fw.Close()"
System.Threading.Thread.Sleep(3000)
fs.Close()
label1.text = "fs.Close()"
System.Threading.Thread.Sleep(3000)
...
System.Diagnostics.Process.Start(Filename)
label1.text = "Open File"
System.Threading.Thread.Sleep(3000)
结果是,在关闭 Excel 后,如果程序没有卡住,用户只会看到“打开文件”,如果卡住,用户只会看到“Label1”。
我做了一些研究,并遇到了一些关于线程化的想法,其中这组代码没有被正确地线程化,因为主窗口是线程化的并且做它自己的事情。我不确定为什么有些计算机运行正常而有些计算机似乎一直锁定。
更多实验:
1) 仅打开导出窗口会导致窗口在记录时卡住。打开导出窗口后,程序会从 SQL 填充一个类似 datagridview 的对象。
2) 我可以使用另一个日志记录软件实例在原始实例记录日志的同时获取数据。这仍然会导致主实例的主窗口锁定。
3) 曾经出现过这些症状的一台计算机似乎已被驱除恶魔。
最佳答案
看看 BackgroundWorker类(class)。 This post应该让你开始。要更新您的 label1.Text,请处理 ProgressChanged事件并相应地通过那里传递进度值。
关于.net - 数据导出表单在文件打开期间/之后偶尔会卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17598617/