2017-01-13 1 views
1

次のコードでは、非常に敏感なオブジェクトが作成され、できるだけ後で実行するほうが良い方法を示しています。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

は、いくつかの方法で、この非同期のですか?それ以外の場合は、操作が完了するまでコードは続行されません。私はここで解決されている問題が何であるかはわかりません。 – David

+2

なぜ後でですか?なぜ今じゃないの?それ以外の場合は、作業を並列スレッドに移してください。しかし、人為的に実行を遅らせる理由はありません。 – Abion47

+5

'Lazy 'を使用して、必要なときにのみコードを実行できます。https://msdn.microsoft.com/en-us/library/dd642331(v=vs.110).aspx – BrunoLM

答えて

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); 
} 

ラムダ式は実行のみをラップします。 この方法では、実際の関数とパラメータを遅延させてカプセル化し、LongTimeAfter()からカプセル化することができます。

ベストプラクティスではありませんが動作します。

-1

タイマーまたは別のthread.sleep(mseconeds)を使用できます。

+1

待つ時間がわかりません。 – Dolev

0

複数のスレッドが含まれていますか?いいえ、すべてのフローが同期している場合(スレッドが1つの場合のみ)、問題が発生してはなりません。

非同期の場合は、「イベントとデリゲート」を使用できます。 ただし、複数のクラスを扱う場合は、次のアプローチが最適です。

それはあなただけでこれを実行することは本当に簡単になり

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); 
} 
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; 
} 
関連する問題