0

スレッドa + b、(両方ともファイルを削除しようとしています)。 aが最初に呼び出され、次にaがまだ実行されている 間にbが呼び出されます。bはファイルを正常に削除しますが、aは削除しません。

を単独で実行すると 'sファイルは正常に削除されます。

コードをステップスルーすると、 aのMultiAttemptFilenameがbで上書きされていることがわかります。

理解できない。

ファイル名を一緒に渡す汎用ハンドラーを指すajax呼び出しがあります。私のハンドラーには、次のコードがあります。

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

私の「Document」クラスから、私は次のように呼んでいます。

    #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

...

これは、キャンセルされた/失敗したアップロードを処理するためのものです。アップロードは常にすぐに削除されるとは限らないため(サーバーロックなど)、ループが発生します。

ここで基本的な何かが欠けていますか?

4

1 に答える 1

1

マルチスレッドの並行性の基本的な概念が欠けているようです。これに特化した本があり、多くの場合、.NET本のセクションでこの問題に対処します。これは、このトピックに関するMicrosoftの記事の1つです。

簡単な答えの1つは、VBの「lock」キーワードを使用する必要があるということです。オブジェクトを作成し、大まかに次のようなことを行います

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

私はVBについては話しませんが、グローバル変数を保護する必要があるものを1つ作成しているようです。グローバルデータは、どのような形式でもかなり悪い考えであり、マルチスレッドに関しては、本当に、本当に悪い考えです。削除するファイルの名前へのアクセスを保護するために、コードを書き直す必要があります。マルチスレッドについて読んでいる間、スレッドプールについても学びたいと思うかもしれません。

于 2011-03-17T06:18:38.827 に答える