私はこれで苦労しています。タスクが別の環境で動作しなくなる
だから私のasp.netアプリケーションでは、このような方法がある:
public CopyResponse thirdStage(CopyRequest request)
{
CopyCCResponse response = new CopyCCResponse();
Task.Run(() =>
{
performCopying(request);
});
return response;
}
private void performCopying(CopyCCRequest request)
{
using (Repository = new myDbContext())
{
// do some initial action
try
{
// in general it looks like below
foreach(var children in father)
{
var newChildren = chldren.Copy();
Repository.Childrens.Add(newChildren);
foreach (var grandchldren in children.grandchildrens)
{
var newGrandchildren = grandchldren.Copy();
newGrandchildren.Parent = newChildren;
Repository.Grandchildrens.Add(newGrandchildren);
}
Repository.SaveChanges();
}
}
catch (Exception ex)
{
// log that action failed
throw ex;
}
}
}
この方法と、(いくつかの類似したがある)他のすべては、何の問題もなく私のローカルコンピュータ上で設計どおりに動作します。
残念ながら、別の環境にこれらのメソッドは失敗:
- は、データの小さな部分をコピーすると、正常に動作します。しかし、操作するオブジェクトが3000を超えると、メソッドは失敗します。
- メインアプリケーションは正しく応答しています。
- ほとんどの操作は正常に実行されます(ほとんどのデータはコピーされ、データベースに保存されます)
- アプリケーションはキャッチブロックに入りません。失敗したコピーの指示は実行されません。例外はエラーハンドラでは検出されません(BTW、私はデフォルトでアプリケーションが独立タスクの例外をキャッチできないことを知っています。
- IISワーカープロセスは、コピーが停止した後で300MB以上のプロセッサパワーを消費すると思われます。サーバー上のRAMの半分以上はまだ無料です。
- 私はWindowsのイベントログを調べましたが、何も見つかりませんでした。
この問題を解決する方法はありますか?
ありがとうございます。あなたは、 'HostingEnvironment.QueueBackgroundWorkItem'は、できる限りシャットダウンを遅らせると書いています。これは、大きくて長いバックグラウンドプロセスを開始するには依然として信頼できる解決策ではないことを意味します。 –
はい。プロセスがhangfire.ioを使用して90秒以上かかると思う場合は、より良いオプションです。別のサービスとして実行するのが最適ですが、クラスをSerialize可能にするにはコードを変更する必要があります。それをプロセスで実行することもできますが、90秒を超えるとどれくらいの時間がかかりますか分かりません。 91秒、4日、私は分かりません –