2011-12-30 3 views
3

非常に長いsp(SSMSで約1時間のsp実行時間)を実行するasp.netページを作成しました。長いSP実行中にスレッドが中止されましたか?

このSPを有効にするAdmin.aspxがあります。 web.configファイルで

私が追加しました:アイブ氏は、追加接続のプロパティでも

<httpRuntime maxRequestLength="111264" requestValidationMode="2.0" executionTimeout="10000000" /> 

_cmd.CommandTimeout = 0; // unlimited 
関数は(SPを有効にする(ASHXに)jqueryのAJAXを使用している

jqueryはspをアクティブにするashxファイルを呼び出します。

public void ProcessRequest(HttpContext context)  
{ 
    string xmlFileNameParam = ... 
    string bakFileName = ... 

    ParameterizedThreadStart ThreadWithParam = dbFuncForThread; 

    Thread thread = new Thread(ThreadWithParam); 
    thread.IsBackground = false; 

    dynamic d = new ExpandoObject(); 
    d.XmlFileNameParam = xmlFileNameParam; 
    d.BakFileName = bakFileName; 
    thread.Start(d); 
} 

public void dbFuncForThread(dynamic d) 
{ 
    // activate the long sp 
} 

しかし、しばらくして、私はこのエラーを参照してください。私はUIは、私はASHXファイル内のスレッドを作成した操作が終了するまでブロックされますしたくありませんでしたしかし

EventLog(および操​​作が停止しました):**

問題の行があります259Threadが中止されました。 at System.Threading.Thread.SleepInternal(Int32 millisecondsTimeout)*

なぜですか?

は、私がスレッドにそれが必要なすべての環境(接続タイムアウト、実行タイムアウト)

P.S.を与えました 私はスレッドを使用して、このような通常のコードを入れていない場合は(UIはいえブロックされてい):

public void ProcessRequest(HttpContext context)   
{ 
    string xmlFileNameParam = ... 
    string bakFileName = ... 

    dynamic d = new ExpandoObject(); 
    d.XmlFileNameParam = xmlFileNameParam; 
    d.BakFileName = bakFileName; 

    dbFuncForthread(d); 
} 

public void dbFuncForThread(dynamic d ) 
{ 
    // activate the long sp... 
} 

ので、コードが細かいとすべてがうまくています。どのようにしてそれがなぜですか、どうすれば解決できますか?

+1

おそらく、ストアドプロシージャを最適化する時間ですか? – Oded

+0

@はspは非常にシンプルで、bakファイルを読み込み、データをスクランブルし、新しいbakを保存します....そのちょうどハッシュデータ...かなりシンプルなsp。 –

+0

@ロイ:なぜ動的オブジェクトを使用しますか? – abatishchev

答えて

0

私はあなたのデザインを再考するかもしれないと思うかもしれません。 Webサービスのパスデータからspを実行するWindowsサービスへWeb環境におけるこのシナリオの明らかな問題は、IISResetまたはappdomain recycleがすべてのスレッドを中止する可能性があることです。

+0

だから私はスレッドを削除する理由は?それはまだiisの下で走っています...? –

+0

probはメインスレッドがありません。火災や忘れた場合 –

+0

'メインスレッドはありません。 –

0

このスレッドは、SPが完了するまで長く待たなければならないようには思えませんが、SQLコールのタイムアウトではありません。明示的に新しいスレッドを開始してSPを呼び出すのではなく、非同期に呼び出すことはできますか?Asynchronous call of a SQL Server stored procedure in C#

+0

あなたのヒントを使用すれば、beginXXX - asp.netはそれを待つことはありませんか?また、なぜそれは**私のスレッドを待つ**のように思える** **私は彼に言った場合、その新しいスレッド... that? –

+0

待つ必要がある場合は、endXXを呼び出すことができます。上記のコードで何が起こっているのかは完全にはわかりません。私は一般的に、ページのライフサイクルで1時間かかる何かを実行することは悪い考えだと思います。 1つのリクエストでプロセスを開始し、そのリクエストをすぐに完了できるように、アプリケーションを考慮します。 SPの完成に向けてさらに作業を行う必要がある場合は、別の解決方法を考えてください。 –

関連する問題