2011-01-22 9 views
3

メソッドの実行に時間がかかりすぎる場合、メソッドの実行を中止するにはどうすればよいですか?c# - 実行に時間がかかりすぎる場合、メソッドの実行を中止します

string foo = DoSomethingComplex(); 

しかしDoSomethingComplex()は(20秒が言うことができます)時間がかかりすぎている場合。 次にfooを ""に設定します。

+0

DoSomethingComplex()をスレッドとして実行できますか? – Auxiliary

+1

この記事では面白い解決策を探しています:http://stackoverflow.com/questions/299198/implement-c-generic-timeout –

+2

スレッドを中止することはお勧めしません。可能であれば、スレッドを別のAppDomainで実行します。 – CodesInChaos

答えて

5

あなたは、その後、あなたの方法を実行する新しいスレッドを作成することができますスレッドが指定された時間の前に正常に終了した場合

thread.Start(); 
bool success = thread.Join(20000); 

はtrueを返しに参加。明らかに、メソッドを中止しないでください(おそらくそのを直接行うことはできません)が、スレッド - しかし、それはあなたが望むものを達成するだろうと思われます。

単純なスレッディングコードの例は、おそらく以下のようになります。

public string DoSomethingComplex(int param) 

し、同じクラスに:他の方法でコード別名

public delegate void Callback(string newFoo); 

public void ThreadedDoSomethingComplexEnded(string newFoo) 
{ 
    foo = newFoo; 
} 

private static void ThreadedDoSomethingComplex(ClassFooIsIn fooObject, int param, Callback callback) 
{ 
    var newFoo = fooObject.DoSomethingComplex(param); 
    callback(newFoo); 
} 

使用で私は方法についてなど、いくつかのクラスでは、パラメータを使用して署名に関するすべてをいくつかの仮定をした注ClassFooIsIn:

var thread = new Thread(() => ThreadedDoSomethingComplex(this, param, ThreadedDoSomethingComplexEnded)); 
thread.Start(); 

if (!thread.Join(20000)) 
{ 
    foo = ""; 
} 

現実には、あなたはおそらく=「」FOOをスキップすることができるようにfooが、上に示した用法前に初期化する必要があります。ライン。

+0

確かに、例がありがとう – raklos

0

を中止することはできません。メソッドの実行。あなたができることは別のスレッドでこのメソッドを実行し、時間がかかりすぎるとスレッドを中止することです。

+2

Thread.Abort()は非常に推奨されません。 –

1

DoSomethingComplexための別々のスレッドを作成し、メインスレッドの動作の完了を待つ:

  1. AutoResetEventのインスタンスを作成し、DoSomethingComplexを実行するスレッドに渡します。 WAITONEはfalseが返された場合、それが動作するかどうか、スレッドを停止するThread.Abort()メソッドを使用し
  2. メインスレッドで完了
  3. 使用AutoResetEvent.WaitOne(タイムアウト)についてのメインスレッドを伝えるためにDoSomethingComplexで
  4. 使用AutoResetEvent.Set()メソッド長過ぎる。
0

LiMexまたは限定実行の研究。

関連する問題