// 新建任务 static void NewTask(SaveTask.Type type, Save save, ISaveTarget target) { var task = new SaveTask() { type = type, save = save, target = target, }; // 预处理 switch (type) { case SaveTask.Type.Save: task.exception = save.ToBytes(out task.data); break; default: task.data = null; task.exception = null; break; } _tasks.Enqueue(task); // 第一个任务在创建后立即开始执行 if (_tasks.Count == 1) { BeginTask(); } }
// 新建任务 void NewTask(SaveTask.Type type, Save save, IStorageTarget target) { if (_disposed) { throw new Exception("SaveManager had already disposed."); } var task = new SaveTask() { type = type, save = save, target = target, }; // 前期处理 switch (type) { case SaveTask.Type.Save: task.exception = save.ToBytes(out task.data); break; default: task.data = null; task.exception = null; break; } _tasks.Enqueue(task); // 第一个任务需要主动唤起处理线程 if (_tasks.Count == 1) { OnBeginTask(_tasks.Peek()); } }
// 后台线程 void BackgroundThread() { while (true) { _event.WaitOne(); if (_task == null) return; switch (_task.type) { case SaveTask.Type.Load: try { _task.data = _task.target.Read(); } catch (Exception e) { _task.exception = e; } break; case SaveTask.Type.Save: if (_task.success) { try { _task.target.Write(_task.data); } catch (Exception e) { _task.exception = e; } } break; case SaveTask.Type.Delete: try { _task.target.Delete(); } catch (Exception e) { _task.exception = e; } break; } _task = null; _finished = true; } }
void ISaveTarget.DeleteAsync(SaveTask task) { ApplicationKit.update += MainThreadUpdate; ThreadPool.QueueUserWorkItem(BackgroundThreadProc); void BackgroundThreadProc(object _) { try { File.Delete(_fullPath); } catch (Exception e) { task.exception = e; } _finished = true; } }
void ISaveTarget.WriteAsync(SaveTask task) { ApplicationKit.update += MainThreadUpdate; ThreadPool.QueueUserWorkItem(BackgroundThreadProc); void BackgroundThreadProc(object _) { try { if (_fullDir != null) Directory.CreateDirectory(_fullDir); using (var stream = new FileStream(_fullPath, FileMode.Create, FileAccess.Write)) { stream.Write(task.data, 0, task.data.Length); } } catch (Exception e) { task.exception = e; } _finished = true; } }
void ISaveTarget.ReadAsync(SaveTask task) { ApplicationKit.update += MainThreadUpdate; ThreadPool.QueueUserWorkItem(BackgroundThreadProc); void BackgroundThreadProc(object _) { try { using (var stream = new FileStream(_fullPath, FileMode.Open, FileAccess.Read)) { task.data = new byte[stream.Length]; stream.Read(task.data, 0, task.data.Length); } } catch (Exception e) { task.exception = e; } _finished = true; } }
/// <summary> /// 完成任务时触发 /// </summary> protected abstract void OnFinishTask(SaveTask task);
/// <summary> /// 开始任务时触发。当任务完成时设置 _finished 标记通知主线程 /// </summary> protected abstract void OnBeginTask(SaveTask task);
protected override void OnFinishTask(SaveTask task) { }
protected override void OnBeginTask(SaveTask task) { _task = task; _event.Set(); }