update operation system

异步操作增加执行优先级
This commit is contained in:
hevinci
2023-10-27 16:08:38 +08:00
parent 9418544264
commit bc9a4e07e2
20 changed files with 391 additions and 429 deletions
@@ -5,16 +5,24 @@ using System.Threading.Tasks;
namespace YooAsset
{
public abstract class AsyncOperationBase : IEnumerator
public abstract class AsyncOperationBase : IEnumerator, IComparable<AsyncOperationBase>
{
// 用户请求的回调
private Action<AsyncOperationBase> _callback;
// 是否已经完成
internal bool IsFinish = false;
/// <summary>
/// 所属包裹
/// </summary>
public string PackageName { private set; get; }
/// <summary>
/// 优先级
/// </summary>
public uint Priority { set; get; } = 0;
/// <summary>
/// 状态
/// </summary>
@@ -80,7 +88,7 @@ namespace YooAsset
internal abstract void InternalOnUpdate();
internal virtual void InternalOnAbort() { }
internal void SetPackageName(string packageName)
internal void Init(string packageName)
{
PackageName = packageName;
}
@@ -91,8 +99,14 @@ namespace YooAsset
}
internal void SetFinish()
{
IsFinish = true;
// 进度百分百完成
Progress = 1f;
_callback?.Invoke(this); //注意:如果完成回调内发生异常,会导致Task无限期等待
//注意:如果完成回调内发生异常,会导致Task无限期等待
_callback?.Invoke(this);
if (_taskCompletionSource != null)
_taskCompletionSource.TrySetResult(null);
}
@@ -115,6 +129,13 @@ namespace YooAsset
_callback = null;
}
#region 排序接口实现
public int CompareTo(AsyncOperationBase other)
{
return other.Priority.CompareTo(this.Priority);
}
#endregion
#region 异步编程相关
bool IEnumerator.MoveNext()
{
@@ -45,29 +45,50 @@ namespace YooAsset
{
_frameTime = _watch.ElapsedMilliseconds;
// 添加新的异步操作
// 添加新增的异步操作
if (_newList.Count > 0)
{
bool sorting = false;
foreach (var operation in _newList)
{
if (operation.Priority > 0)
{
sorting = true;
break;
}
}
_operations.AddRange(_newList);
_newList.Clear();
// 重新排序优先级
if (sorting)
_operations.Sort();
}
// 更新所有的异步操作
for (int i = _operations.Count - 1; i >= 0; i--)
// 更新进行中的异步操作
for (int i = 0; i < _operations.Count; i++)
{
if (IsBusy)
break;
var operation = _operations[i];
if (operation.IsFinish)
continue;
if (operation.IsDone == false)
operation.InternalOnUpdate();
if (operation.IsDone)
{
// 注意:如果业务端发生异常,保证异步操作提前移除。
_operations.RemoveAt(i);
operation.SetFinish();
}
}
// 移除已经完成的异步操作
for (int i = _operations.Count - 1; i >= 0; i--)
{
var operation = _operations[i];
if (operation.IsFinish)
_operations.RemoveAt(i);
}
}
@@ -113,7 +134,7 @@ namespace YooAsset
public static void StartOperation(string packageName, AsyncOperationBase operation)
{
_newList.Add(operation);
operation.SetPackageName(packageName);
operation.Init(packageName);
operation.SetStart();
}
}