为什么在.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)