Я хочу использовать список для хранения действий в фреймворке при выполнении асинхронных операций.
Затем, когда структура синхронизируется, я зациклирую список и выполняю действия.Временное хранение делегата для вызова позже
Есть ли способ сделать это, с этим в фокусе:
- Без отражений/Динамический ввод.
- Не создавать классы/структуры для каждого нового метода вызова.
- Тип сейфа.
- хранить действия в списке.
- хранить различные виды методов и параметров.
- Выполните список позже.
Причина, по которой я не хочу использовать отражение, заключается в том, что это проблема производительности. Он будет использоваться очень часто.
В этом случае это связано с игрой, но код может использоваться как всенаправленный, и был бы превосходным для многопоточности, если бы отражения/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». Но вы можете сделать список «Список». Я понял, что после публикации этого ответа и поэтому я добавил еще один вариант с этим решением. –
MarcinJuraszek
Это аккуратно + возможность добавлять дополнительную информацию в MyDelayCaller, чтобы узнать, когда и кто вызвал ее для отладки и т. Д. – Eli