メソッドの実行に時間がかかりすぎる場合、メソッドの実行を中止するにはどうすればよいですか?c# - 実行に時間がかかりすぎる場合、メソッドの実行を中止します
string foo = DoSomethingComplex();
しかしDoSomethingComplex()
は(20秒が言うことができます)時間がかかりすぎている場合。 次にfooを ""に設定します。
メソッドの実行に時間がかかりすぎる場合、メソッドの実行を中止するにはどうすればよいですか?c# - 実行に時間がかかりすぎる場合、メソッドの実行を中止します
string foo = DoSomethingComplex();
しかしDoSomethingComplex()
は(20秒が言うことができます)時間がかかりすぎている場合。 次にfooを ""に設定します。
あなたは、その後、あなたの方法を実行する新しいスレッドを作成することができますスレッドが指定された時間の前に正常に終了した場合
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が、上に示した用法前に初期化する必要があります。ライン。
確かに、例がありがとう – raklos
を中止することはできません。メソッドの実行。あなたができることは別のスレッドでこのメソッドを実行し、時間がかかりすぎるとスレッドを中止することです。
Thread.Abort()は非常に推奨されません。 –
DoSomethingComplexための別々のスレッドを作成し、メインスレッドの動作の完了を待つ:
LiMexまたは限定実行の研究。
DoSomethingComplex()をスレッドとして実行できますか? – Auxiliary
この記事では面白い解決策を探しています:http://stackoverflow.com/questions/299198/implement-c-generic-timeout –
スレッドを中止することはお勧めしません。可能であれば、スレッドを別のAppDomainで実行します。 – CodesInChaos