为什么文件不会立即在.net中关闭?

时间:2014-09-19 15:38:25

标签: .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 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

单击按钮时调用此方法。如果我每2秒点击一次,则会出错:“另一个进程使用文件”。我无法理解这个问题,因为我使用的是file.close。我认为这可能与线程问题有关,我问这个问题链接:我尝试了线程。像这样的代码:

when a method is called , which thread will be run in c# and java?

我试过线程。像这样的代码:

Dim thread As Threading.Thread = Nothing
Public Sub CreateXml()

    'cok hızlı tıklandıgı zaman xml olusturmak için çalışan thread önceki thread in file.close yapmasını bekler
    '   If Not checkThread Then


    Dim txtName As String = InputTxt.Items(InputTxt.SelectedIndex)
    txtName = txtName.Substring(0, txtName.IndexOf("."))

    While Not IsNothing(thread) AndAlso thread.IsAlive
        Dim a = ""
        ' wait loop
    End While

    thread = New Threading.Thread(Sub() WriteXml(txtName))
    thread.IsBackground = False
    thread.Start()

End Sub

这也行不通。我找不到任何建议。我要等待回应。

由于

1 个答案:

答案 0 :(得分:0)

显然,如果您在两个线程中同时运行代码,则会出现并发错误,因为第二个线程会尝试打开第一个线程已在使用的文件。例如,您需要基于文件名的同步。另一个解决方案是在运行线程时禁用该按钮,并在完成处理后再次启用它。

在这种特殊情况下(大约只需两秒钟),你根本不应该乱用线程。 只需使用方法的就地调用替换代码中的以下代码段:

thread = New Threading.Thread(Sub() WriteXml(txtName))
thread.IsBackground = False
thread.Start()

替换为:

WriteXml(txtName)

这样,对WriteXml的调用将阻止UI线程直到完成,用户将没有机会点击该按钮两次。