求解“泵式等待”问题

海涵德 2010-07-18 04:53:21

下面这段代码读取一个文件夹,该文件夹下有400多万个文件,执行到
fi_list = di.GetFiles()
这一行后程序等待一段时间就弹出对话框报告的主要内容是:“泵式等待”
(这个文件即使在操作系统下打开也需要很长时间,时间超过20分钟)

        Dim di As DirectoryInfo
Dim directory_name As String
Dim fi As FileInfo
Dim fi_list() As FileInfo
Dim full_file_name As String

full_file_name = "E:\madaming\Download\m00000001.as" ' OpenFileDialog1.FileName
fi = New FileInfo(full_file_name)
directory_name = fi.DirectoryName

di = New DirectoryInfo(directory_name)
Try
fi_list = di.GetFiles() Catch ex As Exception
End Try


CLR 无法从 COM 上下文 0x2f6fe8 转换为 COM 上下文 0x2f7158,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作。这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积。要避免此问题,所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息。

网上给出一些折中的办法,如:在vs2008开发平台的做[调试]-[异常]-[ManagedDebuggingAssisants][ContextSwitchDeadlock]的[异常]选项去掉,试了试只是不提示对话框了,但等了半天没有结果。有使用了线程的办法主程序可以正常运行,刚写完程序,线程还在等待返回消息(我的线程里定义了消息,并在线程结束时发出完成消息消息),也很长时间了(10分钟以上了,至少我已经输入了这段文字)

请教有什么解决办法读取一个上百万的文件夹,任何办法都可以。
...全文
1008 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
海涵德 2010-07-18
  • 打赏
  • 举报
回复
调试了一下确实出现同样的问题。
海涵德 2010-07-18
  • 打赏
  • 举报
回复
也许你的代码第一行就会出问题。
兔子-顾问 2010-07-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 madaming 的回复:]
引用 3 楼 wuyazhe 的回复:
如果真这么长时间都死等,客户的体验会很不好的。还是逐个获取,增加进度条,效果好一点。

怎样逐个获取,至少要打开文件加吧?
请给出逐个获取的代码
[/Quote]

逐个读取,我的意思是不要一次获得文件列表。逐个获得。

Dim stmp = Dir("g:\windows\*.*")
Do Until stmp = ""
MsgBox(stmp)
stmp = Dir()
Loop
海涵德 2010-07-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lost_painting 的回复:]
运行cmd -->
cd\
f:
F:\>dir /s /a *.* >1.txt

呵呵,历遍搞定
[/Quote]
在1楼的链接中看到有人竟然能想出这个鬼办法,不过是个好办法。在加工一下:
cd \x\x\x\...
dir *.jpg>l.txt

海涵德 2010-07-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuyazhe 的回复:]
如果真这么长时间都死等,客户的体验会很不好的。还是逐个获取,增加进度条,效果好一点。
[/Quote]
怎样逐个获取,至少要打开文件加吧?
请给出逐个获取的代码
兔子-顾问 2010-07-18
  • 打赏
  • 举报
回复
如果真这么长时间都死等,客户的体验会很不好的。还是逐个获取,增加进度条,效果好一点。
海涵德 2010-07-18
  • 打赏
  • 举报
回复
多谢诸位的热心帮助,在我刚看到你们的贴子时我的后台线程终于返回结果,时间大概是:18:20,第一个帖子的时间是16:53,用时1个小时多。现将调试贴图贴上供大家参考:


贴图上有些地方剪掉了,请诸位谅解。不管怎么说问题解决了,时间太长了,处理这么多文件等待也值了。
部分代码如下:
VB.NET code#Region " - 线程处理"
Private _t As Thread
Private Event event_thread_end(ByVal file_info_list() As FileInfo)

Private Sub background_process(ByVal directory_info As DirectoryInfo)
Dim di As DirectoryInfo
Dim directory_name As String
Dim fi As FileInfo
Dim fi_list() As FileInfo
Dim full_file_name As String

full_file_name = "E:\madaming\Download\m00000001.jpg" '
fi = New FileInfo(full_file_name)
directory_name = fi.DirectoryName

di = New DirectoryInfo(directory_name)
Try

fi_list = di.GetFiles()
System.Threading.Thread.Sleep(1000)

RaiseEvent event_thread_end(fi_list)

Catch ex As Exception
RaiseEvent event_thread_exception(ex.Message)
End Try

End Sub

Private Sub Button_start_thread_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_start_thread.Click

_t = New Thread(AddressOf background_process)
_t.Start()

End Sub
''''''''
...

Private Sub Button_StopThread_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_StopThread.Click
_t.Abort()
End Sub

#End Region

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧