佇列先進后出,堆疊先進先出,解決簡單的異步并發問題.堆疊輔助類非原創
文章目錄
- 一.佇列輔助類
- 二.佇列Samples
- 三.堆疊輔助類(基于佇列進行修改)
- 四.堆疊Samples
一.佇列輔助類

using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
/// <summary>
/// 異步任務佇列
/// </summary>
public class AsyncQueueTask : MonoBehaviour
{
public delegate Task<bool> TaskDel(object data);
private bool isWait;
//方法佇列
Queue<TaskDel> taskQueue = new Queue<TaskDel>();
//引數佇列
Queue<object> paraQueue = new Queue<object>();
/// <summary>
/// 呼叫這個即可
/// </summary>
/// <param name="ac">方法</param>
/// <param name="data">引數</param>
public void AddQueueTask(TaskDel ac, object data)
{
Debug.Log("入隊");
taskQueue.Enqueue(ac);
paraQueue.Enqueue(data);
StartTask();
}
async void StartTask()
{
if (!isWait && taskQueue.Count != 0)
{
isWait = true;
await taskQueue.Peek()(paraQueue.Peek());
Debug.Log("出隊");
taskQueue.Dequeue();
paraQueue.Dequeue();
isWait = false;
StartTask();
}
}
}
二.佇列Samples
每次點擊不會干擾之前異步的代碼運行
執行完當前異步方法后在執行之后的方法
呈現先進后出的效果,直到執行完佇列中的所有方法
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Rendering;
public class QueueTaskSamples : MonoBehaviour
{
private int _clickCount;
public AsyncQueueTask _asyncQueue;
/// <summary>
///按鈕系結方法
/// </summary>
public void OnClick()
{
_clickCount++;
_asyncQueue.AddQueueTask(OnMethod,_clickCount);
}
/// <summary>
/// 系結方法物體
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
private async Task<bool> OnMethod(object index)
{
await Task.Delay(1000);
Debug.Log("你點擊了按鈕"+index.ToString()+"次");
return true;
}
}

三.堆疊輔助類(基于佇列進行修改)

using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
public class AsyncStackTask : MonoBehaviour
{
public delegate Task<bool> TaskDel(object data);
private bool isWait;
//方法堆疊
Stack<TaskDel> taskStack = new Stack<TaskDel>();
//引數堆疊
Stack<object> paraStack = new Stack<object>();
/// <summary>
/// 呼叫這個即可
/// </summary>
/// <param name="ac">方法</param>
/// <param name="data">引數</param>
public void AddStackTask(TaskDel ac, object data)
{
Debug.Log("入堆疊");
taskStack.Push(ac);
paraStack.Push(data);
StartTask();
}
async void StartTask()
{
if (!isWait && taskStack.Count != 0)
{
isWait = true;
await taskStack.Peek()(paraStack.Peek());
Debug.Log("出堆疊");
taskStack.Pop();
paraStack.Pop();
isWait = false;
StartTask();
}
}
}
四.堆疊Samples
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using Scirpts;
using UnityEngine;
using UnityEngine.Rendering;
public class QueueTaskSamples : MonoBehaviour
{
private int _clickCount;
public AsyncQueueTask _asyncQueue;
public AsyncStackTask _asyncStack;
/// <summary>
///按鈕系結方法
/// </summary>
public void OnClick()
{
_clickCount++;
_asyncStack.AddStackTask(OnMethod,_clickCount);
// _asyncQueue.AddQueueTask(OnMethod,_clickCount);
}
/// <summary>
/// 佇列系結方法物體
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
private async Task<bool> OnMethod(object index)
{
await Task.Delay(1000);
Debug.Log("你點擊了按鈕"+index.ToString()+"次");
return true;
}
}
使用效果圖

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/341273.html
標籤:區塊鏈
上一篇:CSP 2016-4
