我正在处理一个文件。这是代码:
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
这也行不通。我找不到任何建议。我要等待回应。
由于
答案 0 :(得分:0)
显然,如果您在两个线程中同时运行代码,则会出现并发错误,因为第二个线程会尝试打开第一个线程已在使用的文件。例如,您需要基于文件名的同步。另一个解决方案是在运行线程时禁用该按钮,并在完成处理后再次启用它。
在这种特殊情况下(大约只需两秒钟),你根本不应该乱用线程。 只需使用方法的就地调用替换代码中的以下代码段:
thread = New Threading.Thread(Sub() WriteXml(txtName))
thread.IsBackground = False
thread.Start()
替换为:
WriteXml(txtName)
这样,对WriteXml的调用将阻止UI线程直到完成,用户将没有机会点击该按钮两次。