我有以下代码,其中创建了一个大的敏感对象,并且最好尽可能在以后触发执行。
public MyObject MyExecution(P1 p1, P2 p2, P3 p3, P4 p4)
{
return new MyObject(p1,p2,p3,p4);
]
public LongTimeAfter(Invokable<MyObject> invk)
{
MyObject obj = invk.Invoke();
}
public void main(P1 p1, P2 p2, P3 p3, P4 p4)
{
Invokable<MyObject> invk = new Invokable<MyObject>(new Func<MyObject,P1,P2,P3,P4>(MyExecution), p1, p2, p3, p4);
LongTimeAfter(invk);
}
class Invokable<T>
{
private Func<T,P1,P2,P3,P4> _f;
private P1 _p1;
private P2 _p2;
private P3 _p3
private P4 _p4;
public Invokable<T>(Func<T,P1,P2,P3,P4> f, P1 p1, P2 p2, P3 p3, P4 p4)
{
_f = f;
_p1 = p1;
_p2 = p2;
_p3 = p3;
_p4 = p4;
}
public T Invoke()
{
return _f(_p1, _p2, _p3, _p4);
}
}
我知道在函数式编程中,变量并没有声明它是可能的。
这可能在c#中吗?为什么不,或者请你如何。
答案 0 :(得分:1)
也许这将有助于未来的人:
public MyObject MyExecution(P1 p1, P2 p2, P3 p3, P4 p4)
{
return new MyObject(p1,p2,p3,p4);
]
public LongTimeAfter(Func<MyObject> invk)
{
MyObject obj = invk();
}
public void Main(P1 p1, P2 p2, P3 p3, P4 p4)
{
Func<MyObject> invk = () => { return MyExecution(p1, p2, p3, p4);};
LongTimeAfter(invk);
}
lambda表达式仅包装执行。
通过这种方式,它可以被延迟并封装来自LongTimeAfter()
的实际函数和参数。
虽然这不是最好的做法,但它会起作用。
答案 1 :(得分:0)
是否涉及多个线程?如果没有和所有流程同步(仅在一个线程中),它不应该导致你说的问题。
如果它是异步的,您可以使用“事件和代理”, 但是,当我们处理多个类时,遵循以下方法是最好的。
就像,
public delegate void LongTimeAfterEventHandler(Func<MyObject>);
public event LongTimeAfterEventHandler LongTimeAfterEventTriggred;
public MyObject MyExecution(P1 p1, P2 p2, P3 p3, P4 p4)
{
//Assuming that object of "MyObject" is needed to pass only in "LongTimeAfter" method
if(LongTimeAfterEventTriggred != null)
LongTimeAfterEventTriggred(new Invokable<MyObject>(new MyObject(p1,p2,p3,p4)));
}
public LongTimeAfter(Func<MyObject> invk)
{
MyObject obj = invk.Invoke();
}
public void Main(P1 p1, P2 p2, P3 p3, P4 p4)
{
this.LongTimeAfterEventTriggred += LongTimeAfter;
MyExecution(P1 p1, P2 p2, P3 p3, P4 p4);
}
答案 2 :(得分:0)
这样做真的很简单:
void Main()
{
Func<int> f = () => MyExecution(1, 2, 3, 4);
//some time later
int result = f();
}
public int MyExecution(int p1, int p2, int p3, int p4)
{
return p1 + p2 + p3 + p4;
}
答案 3 :(得分:-1)
您可以使用计时器或其他thread.sleep(mseconeds)。