ここで
は、私がやったものだ:
ステップ1 & 2 - アクションメソッドが呼び出されると、長期実行中のスレッドが私のアクションメソッドが呼び出されるとき
開始され、それはユニークなIDを生成します。 PdfGenerator
クラスのインスタンスをインスタンス化し、PdfGenerator.Generate
を呼び出して起動する新しいスレッドを作成します。
public class PdfGenerator
{
public string State;
public byte[] Data;
public void Generate()
{
// Generate PDF/Long running process
// Should update State as it goes
// ...
// Once finished, Data is populated with the binary byte[]
}
}
スレッドが起動(または開始する前に)いったん発電インスタンスがキャッシュに保存されています。それは私の見解で参照できるように
HttpContext.Cache[guid] = generator;
また、私はViewDataをにGUIDを添付スクリプト。
ステップ3 & 4 - 表示および更新状況/進捗ビュースレッドが実行されていて、PDFの生成が開始されたことを今
、私は私の進捗ビュースクリプトを表示することができます。使用してjQueryの$.getJSON
私は世代の状況を見つけるために、別のアクションをポーリングすることができる午前:
[OutputCache(Duration = 0, VaryByName = "none", NoStore = true)]
public JsonResult CheckPdfGenerationStatus(string guid)
{
// Get the generator from cache
var generator = HttpContext.Cache[guid] as PdfGenerator;
if (generator == null)
return Json(null);
else
return Json(generator.State);
}
マイビュースクリプトは、JSONを解釈し、適切な進捗情報が表示されます。
ステップ5 - 生成が完了すると、ユーザ
に現在のファイルは、発電状態に応じて設定されているとjQueryは、この情報を受信した場合、それは、利用可能なリンクを作成し、又は直接使用してファイルを送信しますかjavascripts location.href
。
設定し、ファイルを返すアクションメソッドは、単に[]
public ContentResult DownloadPdf(string guid)
{
var generator = HttpContext.Cache[guid] as PdfGenerator;
if (generator == null)
return Content("Error");
if (generator.State == "Completed")
{
return Content(generator.Data);
}
else
{
return Content("Not finished yet");
}
}
をキャッシュから発電機を取得し、添付のバイトを返し、私は、このような初期化など、より詳細な状態を持っている私の私の実際の作業、実行中と完了しました。進捗率(10進数で表現され、1.0は完了)。
だから、他の誰かが同様のことをしようとするのに役立ちます。
優秀な質問...同じ状況で立ち往生! –