【发布时间】:2014-01-17 22:37:17
【问题描述】:
我想在进行异步操作时使用列表将操作存储到框架中。
然后稍后当框架同步时,我将循环处理列表并执行操作。
有没有办法做到这一点,重点是:
- 无反射/动态调用。
- 不为要调用的每个新方法创建类/结构。
- 输入安全。
- 将操作存储在列表中。
- 存储不同种类的方法和参数。
- 稍后执行列表。
我不想使用反射的原因是因为它是一个性能问题。它会非常频繁地使用。
在这种情况下,它与游戏相关,但代码可以作为一个全能使用,如果可以避免反射/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)
{
}
}
【问题讨论】:
标签: c# multithreading .net-4.0 visual-c#-express-2010