我想在使用異步操作時使用列表作爲存儲動作的框架。
然後,當框架同步後,我將循環列表並執行操作。臨時存儲代理稍後調用
有沒有辦法做到這一點,以此爲焦點:
- 無反射/ DynamicInvoke。
- 不爲每個要調用的新方法創建類/結構。
- 類型安全。
- 將操作存儲在列表中。
- 存儲不同種類的方法和參數。
- 稍後執行列表。
我不想使用反射的原因是因爲它是一個性能問題。這會非常頻繁地使用。
在這種情況下,它與遊戲相關,但代碼可以用作全能,並且如果可以避免reflection/DynamicInvoke,那麼對於多線程來說,它將非常出色。
如果這不可能,那麼還有其他不錯的選擇嗎?
我已經在代碼中做了一個例子,但它使用了反射並且不是類型安全的。
基本上這些步驟是:
1.使用具有多個不同參數的方法填充列表。
2.循環遍歷列表&執行所有具有參數的方法。
3.清除下一個週期的列表。
{
struct MyDelayedCaller
{
public Delegate TheTarget;
public object[] MyParameters;
public MyDelayedCaller(Delegate target, object[] parameters)
{
TheTarget = target;
MyParameters = parameters;
}
}
List<MyDelayedCaller> Temporary = new List<MyDelayedCaller>();
void Update()
{
//something happened and another class needs to know
//but it will have to wait for the sync so as to not cause any treading problems
Temporary.Add(new MyDelayedCaller(new DelDoSomething1(DoSomething1), new object[] { 10, false }));
Temporary.Add(new MyDelayedCaller(new DelDoSomething1(DoSomething1), new object[] { 11, true }));
Temporary.Add(new MyDelayedCaller(new DelDoSomething3(DoSomething3), new object[] { "Some text" }));
Temporary.Add(new MyDelayedCaller(new DelDoSomething2(DoSomething2), new object[] { 1, 9999, 0.4f }));
}
void Sync()
{
foreach (var item in Temporary)
{
item.TheTarget.DynamicInvoke(item.MyParameters);
}
Temporary.Clear();
}
delegate void DelDoSomething1(int index, bool alive);
void DoSomething1(int index, bool alive)
{
}
delegate void DelDoSomething2(int index, int amount, float scale);
void DoSomething2(int index, int amount, float scale)
{
}
delegate void DelDoSomething3(string text);
void DoSomething3(string text)
{
}
}
難道你不能用'Action'替換那個接口嗎? – usr
@usr你不能從'Action'派生。但是你可以使列表'List'。我意識到,發佈這個答案後,這就是爲什麼我增加了另一個,這個解決方案。 –
MarcinJuraszek
這很整潔,+爲MyDelayCaller添加額外信息以查看調試時間和調用者等等的能力。 – Eli