Exemplo n.º 1
0
        // 新建任务
        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();
            }
        }
Exemplo n.º 2
0
        // 新建任务
        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());
            }
        }
Exemplo n.º 3
0
        // 后台线程
        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;
            }
        }
Exemplo n.º 4
0
        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;
            }
        }
Exemplo n.º 5
0
        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;
            }
        }
Exemplo n.º 6
0
        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;
            }
        }
Exemplo n.º 7
0
 /// <summary>
 /// 完成任务时触发
 /// </summary>
 protected abstract void OnFinishTask(SaveTask task);
Exemplo n.º 8
0
 /// <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();
 }