【发布时间】:2018-01-15 05:59:08
【问题描述】:
我在 windows 10 上使用 .net lang 在 Visual Studio 中制作了一个文件搜索程序,
我的问题从 form1 开始,调用“dim frm2 as form2 = new form2”,
在显示新表单后,我在 form1 上启动一个 while 循环,将数据馈送到表单 2 中的列表框:
1)form1 调用 form2 并显示出来。
2)form1 开始一个while循环。
3)在while循环中,数据被馈送到frm2中的listbox1
现在一切都可以在 windows 10 上运行,while 循环可以根据需要运行而不会出现任何问题,窗口可以失去焦点并重新获得焦点 不会显示任何 @ 987654322@
但是,当我将软件带到运行 windows 7 的朋友计算机上时,安装所有必需的框架和 Visual Studio 本身,从 .sln 中运行它调试模式,并在同一个文件夹上做同样的搜索,结果是:
1)只要form 2不失去焦点,while循环就可以顺利运行 (在 Windows 10 上不会发生的事情)
2) 当我点击屏幕上的任意位置时,软件会失去焦点 导致1)发生(黑屏\白屏\无响应等)
3) 如果我等待循环所需的时间并且不要点击其他任何地方 它保持平稳运行,更新标签应该与 找到的文件数量.. 甚至以 100% 成功 完成循环 (再次,除非我点击某处)
代码示例:
Sub ScanButtonInForm1()
Dim frm2 As Form2 = New Form2
frm2.Show()
Dim AlreadyScanned As HashSet(Of String) = New HashSet(Of String)
Dim stack As New Stack(Of String)
stack.Push("...Directoy To Start The Search From...")
Do While (stack.Count > 0)
frm2.Label4.Text = "-- Mapping Files... -- Folders Left:" + stack.Count.ToString + " -- Files Found:" + frm2.ListBox1.Items.Count.ToString + " --"
frm2.Label4.Refresh()
Dim ScanDir As String = stack.Pop
If AlreadyScanned.Add(ScanDir) Then
Try
Try
Try
Dim directoryName As String
For Each directoryName In System.IO.Directory.GetDirectories(ScanDir)
stack.Push(directoryName)
frm2.Label4.Text = "-- Mapping Files... -- Folders Left:" + stack.Count.ToString + " -- Files Found:" + frm2.ListBox1.Items.Count.ToString + " --"
frm2.Label4.Refresh()
Next
frm2.ListBox1.Items.AddRange(System.IO.Directory.GetFiles(ScanDir, "*.*", System.IO.SearchOption.AllDirectories))
Catch ex5 As UnauthorizedAccessException
End Try
Catch ex2 As System.IO.PathTooLongException
End Try
Catch ex4 As System.IO.DirectoryNotFoundException
End Try
End If
Loop
End Sub
我的结论很简单!
1) windows 7 不支持从 while 循环进行实时 ui(标签)更新 从按钮调用...
2) Windows 7 可能支持新的 线程运行相同的循环
我认为如果我在一个线程中运行所有代码也许用户界面将保持响应
(顺便说一下,windows 10 中的 UI 没有响应,但我仍然看到 标签刷新并且在失去焦点时不会崩溃..)
所以我知道该怎么做,但我也知道如果我这样做,线程将无法更新表单中的列表框或标签并刷新它..
所以线程需要使用数据更新外部文件,而 form2 需要从文件中实时读取该数据,但它会产生同样的问题吗?我不知道该怎么做..可以使用一些帮助和提示。 谢谢!
我必须提到一个事实,即循环在没有响应式 UI 的情况下在 Windows 10 上运行意味着我无法点击任何按钮,但我可以 仍然看到标签刷新但在 Windows 7 上一切正常 除非我点击某个地方,无论我在哪里点击窗口循环 崩溃
我正在使用框架 4.6.2 开发人员
【问题讨论】:
-
请提供可重现的代码示例,以便人们可以帮助您。
-
我添加了一个代码示例 :)
-
它在 Windows 10 中很奇怪,即使 UI 没有响应,一切都运行顺利,而在 Windows 7 中,没有响应 UI 的情况下,一切都运行顺利,除非我点击某个地方,否则一切都没有响应并崩溃。我认为这个问题可以在没有异步调用的情况下解决
-
您必须使用
Async/Await、并行性、任务或多线程来减轻您的 UI 线程的繁重工作和 能够更新它。没有其他(好的)方法可以做到这一点。 -
这听起来确实令人反感,所以这就是为什么我说了我所说的,但我很抱歉我不知道我在想什么......这是和朋友开玩笑......
标签: vb.net multithreading windows-7 crash focus