Пример #1
0
        // 同時リクエスト時の排他制御
        // プロセスが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());
        }
Пример #2
0
        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);
        }