2014-09-19 2 views
0

Я работаю с файлом. это код:Почему файл не закрыт немедленно в .net?

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 

Этот метод вызывается при нажатии кнопки. Если я делаю 1 клик за 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

Совет: вам не следует создавать свои собственные потоки, если вы можете просто использовать «ThreadPool» вместо этого (например, «ThreadPool.QueueUserWorkItem (...)» или использовать TPL (т.е. «Задача», представленная в .NET 4). Создание потоков - очень дорогостоящая операция. – stakx

+0

Вопрос: Сколько времени требуется для записи файла WriteXml? Вы говорите, что вы нажимаете кнопку раз в две секунды, но процесс записи на самом деле занимает гораздо меньше времени? – stakx

+0

Я понял, что это занимает около 10-15 мс. Однако, я думаю, метод close() не отвечает быстро. – user14570

ответ

0

Очевидно, что если вы запустите код одновременно в двух потоках Вы получаете ошибку параллелизма как второй поток пытается открыть файл в уже используются первым потоком. Например, вам нужна синхронизация, основанная на имени файла. Другим решением было бы отключить кнопку во время запуска потока и снова включить ее при завершении обработки.

В этом конкретном случае (всего две секунды) вы не должны путаться с нитями. Просто замените следующий фрагмент из кода с в месте вызова метода:

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

Заменить:

WriteXml(txtName) 

Таким образом, вызов WriteXml будет блокировать поток пользовательского интерфейса, пока не закончится, и у пользователя не будет возможности дважды щелкнуть кнопку.

+0

Хорошая идея. Однако я не мог понять эти два потока. Когда я нажимаю кнопку, я слышал, что поток gui запускается . я прав ? если да, то почему происходит два потока? – user14570

+0

Дополнительные потоки, помимо потока GUI, отображаются, потому что вы явно их создаете: Новый Threading.Thread. Первый появляется, когда вы нажимаете первый раз, второй появляется при повторном нажатии. Если первый поток еще не закончен, вы получите два потока. –

Смежные вопросы