主题 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
...
这是为了处理取消/失败的上传,因为它们并不总是立即删除(服务器锁等),因此循环。
我错过了一些基本的东西吗?
答案 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,但看起来你正在做一件真正需要保护的全局变量。全局数据在任何形式下都是一个糟糕的主意,当谈到多线程时,这是一个非常非常糟糕的主意。您必须重写代码以保护对要删除的文件名的访问。当您阅读多线程时,您可能还想了解线程池。