Одновременно работает только одна тема? - PullRequest
0 голосов
/ 17 марта 2011

Темы a + b , (оба пытаются удалить файлы). Сначала вызывается a , затем b , пока a еще работает. b удаляет файл успешно, но a нет.

Если я запускаю a самостоятельно, файл a удаляется в порядке.

При просмотре кода я вижу, что a MultiAttemptFilename перезаписывается b .

Я не понимаю.

У меня есть вызов ajax, указывающий на универсальный обработчик, который передает имя файла вместе с ним. В моем обработчике у меня есть следующий код:

    Dim Dc As New Document
    Dim MyThread As New Thread(AddressOf Dc.DeleteFileMulitAttempt)
    Dc.MulitAttemptFilename = Filename
    MyThread.Start()

Из моего класса «Документ» я звоню по следующему номеру:

    #Region "Delete"

  Public MulitAttemptFilename As String = ""
  Public Sub DeleteFileMulitAttempt()
      Dim TimeBetweenAttempts As Integer = 2000
      Dim NumberOfAttempts As Integer = 60
      Dim AttemptNumber As Integer = 0
      Dim Success As Boolean = False
      While (AttemptNumber < NumberOfAttempts)
          Try
              Success = (DeleteFile(MulitAttemptFilename) = "Ok")
          Catch ex As Exception
              Success = False
          End Try
          If (Success) Then Exit While
          Thread.Sleep(TimeBetweenAttempts)
          AttemptNumber += 1
      End While
      End If
  End Sub

...

Это для обработки отмененных / неудачных загрузок, поскольку они не всегда удаляются сразу (блокировки сервера и т. Д.), Следовательно, цикл.

Я что-то упустил здесь?

1 Ответ

1 голос
/ 17 марта 2011

Похоже, вам не хватает фундаментальной концепции многопоточного параллелизма. Есть книги, посвященные этому, и часто разделы книг .NET будут посвящены этой проблеме. Вот только одна статья Microsoft на эту тему.

Один короткий ответ: вам нужно использовать ключевое слово VB "lock". Вы создаете объект и делаете примерно что-то вроде

lock(yourLockObject)
{
   //any code that might access a shared resource like the variable 
   //MulitAttempFilename [sic] would go here. 
}

Я не говорю на VB, но похоже, что вы делаете одну вещь, которая действительно должна быть защищена, глобальной переменной. Глобальные данные - это в значительной степени плохая идея в любой форме, а когда дело доходит до многопоточности, это действительно очень плохая идея. Вам придется переписать свой код, чтобы защитить доступ к имени удаляемого файла. Пока вы читаете о многопоточности, вы также можете узнать о пулах потоков.

...