同时只有一个线程似乎一次运行?

时间:2011-03-17 03:28:36

标签: vb.net multithreading generic-handler

主题 a + b ,(两者都试图删除文件)。 首先调用 a ,然后 b ,而 a 仍在运行。 b 成功删除文件,但 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 个答案:

答案 0 :(得分:1)

您似乎可能错过了多线程并发的基本概念。有专门的书籍,通常.NET书籍的部分将解决这个问题。关于这个主题,这里只是one article by Microsoft

一个简短的回答是你需要使用VB的“lock”关键字。您创建了一个对象,并且大致类似

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

我不会说VB,但看起来你正在做一件真正需要保护的全局变量。全局数据在任何形式下都是一个糟糕的主意,当谈到多线程时,这是一个非常非常糟糕的主意。您必须重写代码以保护对要删除的文件名的访问。当您阅读多线程时,您可能还想了解线程池。