为什么在.net中文件没有立即关闭?
我正在处理一个文件。这是代码:为什么在.net中文件没有立即关闭?,.net,multithreading,filestream,fclose,.net,Multithreading,Filestream,Fclose,我正在处理一个文件。这是代码: Private Sub WriteXml(ByVal txtName As String) If Not Directory.Exists("GraphXml") Then Directory.CreateDirectory("GraphXml") End If _fileName = "GraphXml\Graph_" & txtName & ".xml" Dim checkConditio
Private Sub WriteXml(ByVal txtName As String)
If Not Directory.Exists("GraphXml") Then
Directory.CreateDirectory("GraphXml")
End If
_fileName = "GraphXml\Graph_" & txtName & ".xml"
Dim checkCondition As Boolean = False
_file = My.Computer.FileSystem.OpenTextFileWriter(_fileName, False)
_file.WriteLine("<?xml version=""1.0"" encoding=""UTF-8""?>")
_file.WriteLine("<n0>")
DepthFirstSearch(StaticService.AllNodes(0))
_file.WriteLine("</n0>")
_file.Close()
_file.Dispose()
End Sub
这也不起作用。我找不到任何建议。我要等你的回复
谢谢显然,如果在两个线程中同时运行代码,那么当第二个线程试图打开第一个线程已经在使用的文件时,会出现并发错误。例如,您需要基于文件名进行同步。另一种解决方案是在运行线程时禁用该按钮,并在完成处理后再次启用该按钮 在这个只有两秒钟的特殊情况下,您根本不应该弄乱线程。 只需将代码中的以下片段替换为方法的就地调用:
thread = New Threading.Thread(Sub() WriteXml(txtName))
thread.IsBackground = False
thread.Start()
替换为:
WriteXml(txtName)
这样,对WriteXml的调用将阻止UI线程直到完成,用户将没有机会单击按钮两次。建议:当您可以简单地使用线程池时,您不应该创建自己的线程,例如ThreadPool.QueueUserWorkItem…;或者使用TPL,即.NET 4中引入的任务。创建线程是一项非常昂贵的操作。问题:写文件需要多长时间?你说你每两秒钟点击一次按钮,但写过程真的比这要花更少的时间吗?我意识到它大约需要10-15毫秒。然而,我认为close方法响应不快。你的代码不是异常安全的。一次不幸和一次尝试/抓住就把它吞没了,演出就结束了。学习如何使用Using语句是非常重要的。好主意。然而,我无法理解这两条线索。当我点击按钮时,我听到gui线程正在运行。我说得对吗?如果是这样,为什么会出现两个线程?除了GUI线程之外,还会出现额外的线程,因为您显式地创建了它们:New Threading.thread。第一个在您第一次单击时显示,第二个在您再次单击时显示。如果第一个线程尚未完成,则会得到两个线程。
WriteXml(txtName)