2011-12-06 25 views
3

非同期スレッドの理解を深めようとしています。非同期プロセスが永久に停止するのを停止しますか?

A C#アプリケーションは、このコードが含まれています

IAsyncResult myResult = cmd.BeginExecuteNonQuery(); //start 
while (!myResult.IsCompleted) 
{ 
     myResult.AsyncWaitHandle.WaitOne(65000); 
} 
cmd.EndExecuteNonQuery(myResult); //end 

私の理解では、myResultは(IsComplete)がtrueを返すまで、プログラムが待機するということです。

myResultがtrueを返さない場合(つまり、cmdが永遠に実行される場合)、aSyncタイムアウトは実行されますか?それともそれは走り続けますか?永遠に走るのを止めるにはどうすればいいですか?

+1

WaitOneがタイムアウトにならないのですか? http://msdn.microsoft.com/en-us/library/85bbbxt9.aspx – dash

+1

を参照してください。http://stackoverflow.com/questions/299198/implement-c-sharp-generic-timeout –

+0

@dash - はい、waitoneにタイムアウトがあります。私のコードを更新しました。 –

答えて

3

永遠に実行されないようにする最善の方法は、管理するタイムアウト制限を指定することです。例えば

DateTime dtStart = DateTime.Now; 
const int TIMEOUT_SECONDS = 120; 

while (!myResult.IsCompleted) 
{ 
     if (DateTime.Now.Subtract(dtStart).TotalSeconds > TIMEOUT_SECONDS) 
     { 
      // Cleanup and bail 
     } 
     myResult.AsyncWaitHandle.WaitOne(65000); 
} 
1

MSDNドキュメントはかなり明確なようです。 WaitOneメソッドは、シグナルが返されるまで(ターゲットメソッドは何かを実行して終了する)タイムパネルが経過するまで待機します。永久に(Timespan.Infiniteまたは-1)待機させるか、すぐに(0)に戻すことができます。

@ competent_techさんの回答はこれを示しています。あなたのタイムパンドでスレッドがブロックされ、合計時間が経過していればwhileループを離れることができます。

あなたはおそらくwhileループは必要ありません。あなたが満足している経過時間を設定すると、スレッドが再開し、次に何をするかを決めることができます。

質問に答えて、はい、非同期はそのパラメータに基づいてタイムアウトします。

いつも私は戻って、すべての仕組みを覚えてJoe Albahari'sスレッディングガイドを読む必要があります。

関連する問題