如何在c#中延迟执行

时间:2017-01-13 01:04:24

标签: c#

我有以下代码,其中创建了一个大的敏感对象,并且最好尽可能在以后触发执行。

    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#中吗?为什么不,或者请你如何。

4 个答案:

答案 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)。