// 同時リクエスト時の排他制御 // プロセスが1つでもリクエストは同時にくるからね!Worker Processが複数なら違う方法も考えましょう。 public void Upload(string uploadingPath) { var uploading = _repository.UploadingPhotos(); // ここは非同期にしてもしなくてもどっちでも~。 // 同時にたくさんのファイルアップロードがあって、パフォーマンス問題が起きるなら // 非同期にするのを考えればいいんじゃないかな。コンカレントだし。 //var tasks = new List<Task>(); foreach (var photo in uploading) { // 処理 //var task = Task.Factory.StartNew(photoId => //{ Trace.WriteLine(" uploading - " + photo.Id + " : " + DateTime.Now); var entry = new StorageEntry(photo); entry.Load(uploadingPath); // Provider使ってファイル保存 _storage.AddEntry(entry); // 保存済み _repository.UploadedPhoto(photo.Id); _repository.SaveChanges(); // 一時ファイルの削除 entry.Delete(uploadingPath); Trace.WriteLine(" uploaded - " + photo.Id + " : " + DateTime.Now); //}, up.Id); //tasks.Add(task); } //Task.WaitAll(tasks.ToArray()); }
public Stream GetImage(Photo photo, ResizeMode type, int size) { // クラウドに送り込んだ? if (!photo.IsUploaded) return null; // 処理中? //if (!_processing.Lock(photo.Id)) //{ // var dump = string.Format("[id = {0}, type = {1}, size = {2}]", photo.Id, type, size); // Trace.WriteLine(" can't get lock - " + dump + " : " + DateTime.Now); // return null; //} // ファイルがあるなら即返す var loadName = GenerateFileName(photo.FileName, type, size); var loadPath = CacheFullPath(loadName); var entry = new StorageEntry(photo); var resizer = new ImageResizer(); if (!File.Exists(loadPath)) { // キャッシュになければStorageから取り出す。 var cacheName = RetrieveCache(photo.FileName); if (string.IsNullOrEmpty(cacheName)) return null; // 最適化して回転する var optName = GenerateFileName(photo.FileName, ResizeMode.Optimize); var optPath = CacheFullPath(optName); resizer.Optimize(cacheName, optPath); // ローカルキャッシュにリサイズしたものを取得 GenerateResize(optPath, loadName, type, size); } //_processing.Unlock(photo.Id); var bytes = entry.Load(CachePath, loadName); return bytes == null ? null : new MemoryStream(bytes); }