2011-03-17 53 views
0

主题a + b(都试图删除文件)。 a先被调用,然后ba仍在运行。 b成功删除文件,但是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

看来你可能会错过多线程并发的基本概念。有专门的书籍,.NET书籍的部分内容通常会解决这个问题。这里只是关于这个话题的one article by Microsoft

一个简短的答案是你需要使用VB的“锁定”关键字。您创建一个对象,你做大致类似

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

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

+0

谢谢托德。我在玩Synclock,但读过那篇文章,我认为我会忽略这一点,直到我有更多时间来正确阅读线程。干杯 – Oppdal 2011-03-17 10:59:02

相关问题