2016-06-29 6 views
0

私は、Webアプリケーションでファイルを適切に処理しようとしています。これらのスレッドを正しく同期させる方法は?

lock(lockObject) 
{ 
    //Download file here. 
} 

ので、ダウンロードの途中で、「ダウンロード」のスレッドが待機を「削除」しながら、その同じファイルが別のスレッドから削除されようとしている場合:ファイルをダウンロードすると、私は、オブジェクトをロックオン最初に終了するスレッド:

lock(lockObject) 
{ 
    //Delete file here. 
} 

これは機能しますが、2つのスレッドが同時にファイルをダウンロードできないという問題があります。

複数のスレッドが同時に「ダウンロード」コードを実行できるようにするにはどうすればよいですか?同時に、「ダウンロード」スレッドが完了するまでスレッドが「削除」コードを実行することを許可しませんか?

私は答えがMonitorクラスのどこかにあることを知っていますが、私はそれを取り除く方法がわかりません。

+0

それは、ダウンロードスレッドが1つのファイルをダウンロードするタスクを配布しているかは明らかではありません...しかし、それはどのような場合には、あなたはおそらくマネージャスレッドがロックを保持しなければなりませんし、そのスレッドプールに作業を配布し、あります何らかの方法で。こうすることで、削除スレッドはマネージャスレッドが保持するロックを待つことができますが、マネージャスレッドはそのワーカーのプールで何でもできます。あなたの質問で他に何かを意味するのでなければ?ひどくはっきりしているわけではありません...もっと詳細が役立ちます。 –

+0

@J ...あなたが何を求めているのか分かりません。ダウンロードコードは、ユーザーがHTTP要求を行ったときに.NETによって提供されるスレッドプールからの通常のスレッドによって実行されます。削除コードは、1時間ごとに実行されるサーバー側のクリーンアップジョブによって実行されます。いずれにせよ、私はそれが重要であるとは思わない。 – AxiomaticNexus

+0

いいえ、答えは 'Monitor'クラスにありません。複数のダウンロードスレッドを許可するには、[ReaderWriterLockSlim](https://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim(v = vs.110).aspx)を使用することもできますが、強制的に削除してくださいスレッドは、すべてのダウンロードスレッドが完了するまで待機します。しかし、ファイルをダウンロードした直後にファイルを削除したいのはなぜか、または同じファイルをダウンロードする2つの異なるスレッドをどのようにするのかはわかりません。 –

答えて

1

おそらくReaderWriterLockSlimが必要です。基本的には、ダウンロードスレッドを読者に、削除スレッドをライターとして扱います。任意の数のリーダーを持つことができますが、いずれのライターも排他アクセスを必要とします。したがって、削除メソッドがEnterWriteLockを呼び出すときにファイルがダウンロードされている場合、削除スレッドは、現在のダウンロードがすべて終了するまで待つ必要があります。

ReaderWriterLockSlim theLock = new ReaderWriterLockSlim(); 

void Delete(filename) 
{ 
    theLock.EnterWriteLock(); 
    try 
    { 
     // do delete stuff here 
    } 
    finally 
    { 
     theLock.ExitWriteLock(); 
    } 
} 

void Download(filename) 
{ 
    theLock.EnterReadLock(); 
    try 
    { 
     // do delete stuff here 
    } 
    finally 
    { 
     theLock.ExitReadLock(); 
    } 
}   
関連する問題