Nó hoạt động!
Đây là những gì tôi đã thực hiện:
Bước 1 & 2 - Hành động Phương pháp được gọi là, dài chạy thread được bắt đầu
Khi phương pháp hành động của tôi được gọi, nó tạo ra một ID duy nhất. Sau đó, tôi khởi tạo một thể hiện của lớp PdfGenerator
của mình, tạo một chuỗi mới gọi PdfGenerator.Generate
và khởi động nó.
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[]
}
}
Khi thread đã bắt đầu (hoặc trước khi bắt đầu) trường hợp máy phát điện được lưu trữ trong bộ nhớ cache:
HttpContext.Cache[guid] = generator;
Tôi cũng gắn guid để ViewData để nó có thể được tham chiếu trong quan điểm của tôi kịch bản.
Bước 3 & 4 - Hiển thị và cập nhật tình trạng/tiến độ xem
Bây giờ thread đang chạy và tạo PDF đã bắt đầu, tôi có thể hiển thị view script tiến bộ của tôi. Sử dụng jQuery $.getJSON
tôi có thể thăm dò ý kiến một hành động riêng biệt để tìm thấy trạng thái của thế hệ:
[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);
}
xem kịch bản của tôi diễn giải Json và hiển thị thông tin tiến bộ phù hợp.
Bước 5 - Hiện tại tập tin để sử dụng
Khi thế hệ đã hoàn thành, tình trạng máy phát điện được thiết lập cho phù hợp và khi jQuery nhận được thông tin này, nó có thể hoặc là làm cho có sẵn một liên kết, hoặc trực tiếp gửi hồ sơ sử dụng javascripts location.href
.
Phương pháp hành động mà thiết lập và trả về tập tin đơn giản được máy phát điện ra khỏi bộ nhớ cache và trả về byte kèm theo []
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");
}
}
tôi công việc thực tế của tôi, tôi đã có trạng thái chi tiết hơn như khởi tạo , Chạy và hoàn thành. Cũng như tỷ lệ phần trăm tiến độ (được biểu thị dưới dạng thập phân, 1.0 đang hoàn thành).
Vì vậy, vâng, hy vọng sẽ giúp bất kỳ ai khác cố gắng làm điều gì đó tương tự.
Câu hỏi hay ... bị kẹt trong cùng một tình huống! –