2010-12-27 9 views
0

こんにちは、スレッドが異常終了しましたか?

は、私は「火をして忘れる」が含まれるメソッドをWebサービスを追加したASP.NETアプリケーションがあります。このメソッドが実行されると、ループ(0-99999)が開始され、すべてのループに対してXMLファイルが読み込まれ、データベースに保存されます。

問題は、この処理には数時間かかりますが、通常は「スレッド中止」例外で終了しますか?

私はあなたがexecutionTimeoutを増加させることができることを見ていると、これはどのようにある:

<httpRuntime executionTimeout="604800"/> 
<compilation debug="true"> 

しかし、これは助けませんか?

ループ内にthread.sleepを追加しようとしました。私はそれを500に設定すると半分になります。<を100に設定すると、スレッドが例外を中止する前に1000のループを2回実行しますか?

どうすればこの問題を解決できますか?

+0

長時間実行されているプロセスをWebサービスからリファクタリングする方法はありますか? – rcravens

答えて

8

Webサービス内でループを実行しないでください。代わりに、コンソールアプリケーション、winformsアプリ、またはおそらくWindowsサービスでそれを持ってください。 Webサービスを使用して、他のプログラムを起動します。

Webサービスは基本的にWebページであり、asp.net Webページは長期実行プロセスをホストするものではありません。

この記事は、直接あなたの質問に答えるが、私の答えに関連する情報のスニペットが含まれていません。

http://msdn.microsoft.com/en-us/magazine/dd296718.aspx

しかし、 操作の期間が長く、典型的な よりも大きくなるとASP.NETセッションの継続時間(20 分)または複数のアクタ (私の採用例のように)、ASP.NET は十分なサポートを提供していません。 は、ASP.NETワーカー がアイドル状態で自動的にシャットダウンし、 が自動的にシャットダウンすることを思い出してください。これにより、長時間実行される操作で大きな 問題が発生し、 状態がこれらのプロセス内に保持されるため、 が失われます。

この記事はどんな速度でも読みやすいです。それはあなたにアイデアを提供するかもしれません。

+0

申し訳ありませんが、私のWebホテルはこれを許可していません。 – Banshee

0

これが「答え」なのかどうかは不明ですが、Webサービスコールを受け取ると、そのアクションを別のスレッドにディスパッチすることも考えられます。それが完了するまで実行できます。誰かがこれらのプロセスのうちの2つを同時に開始しないようにする方法を検討したいと思うでしょう。

+0

これは本当に機能しますか?新しいスレッドは同じ方法で処理され、テンションが必要ですか? – Banshee

0

私は 「火と忘れて」メソッドを含むWebサービスを追加した ASP.NETアプリケーションがあります。この メソッドが実行されると、 ループ(0-99999)が開始され、すべてのループに対して はxmlファイルを読み込み、 データベースに保存します。

私はこのアプローチをかなり気にしません... ...多くの理由(リセットの途中のような)で悪いです。私は要求をキューイングしてからリターンし、キューのリスナにトランザクションの整合性のある処理をさせます。

とにかく、何を行うことができますすることです:

  • キュー物事をピックアップするwpoolスレッドの作業項目。
  • すぐに返品ください。

さらに、Webサービスやこのようなものは、1時間単位の長時間実行されるプロセスには適していません。ワークフローをチェックし、別々に処理します。

関連する問題