簡體   English   中英

在MVC3 dotnet C#中創建文件或報告或Excel線程

[英]Create a file or report or excel thread in mvc3 dotnet c#

我正在使用mvc3,盡管我經常看到此問題,但仍未找到有關使用哪種技術的明確答案。 大多數解決方案似乎相互矛盾,使用的是舊庫和新庫。 似乎有很多關於異步的討論,但是隨后出現了很多關於為什么它不是“安全”的答案。

所需要的是。

  1. MVC3網站-用戶單擊按鈕以創建報告。

  2. 該報告很大,將被創建並存儲在Web服務器磁盤上(最多可能需要10分鍾)。

  3. 用戶不需要知道何時完成創建報告。

  4. 該網頁僅返回創建報告的事實,讓您繼續進行操作而無需再次與該過程進行交互。

  5. 為了爭辯,服務器硬件相當不錯,但是可能有100多個並發用戶,他們都在同一時間創建自己的獨立大報告。 我想它可能會產生的唯一問題是服務器硬件安裝足夠強大,而不是配置或軟件問題。

我一直在尋找“任務並行庫”,也許是這樣做的方法。 但是我再次收到許多有關如何執行此操作的報告。

有人建議使用WCF服務,但是關於為什么/為什么不這樣做的報告又很多,但相互矛盾。 即現在過時/更好的替代品等

一般來說,我想要的是在另一個不會使ii混亂的線程中創建文件(根據所使用的方法,從池中耗盡線程等)

這是一組相當開放的問題。 這不是一件壞事,但是沒有很多“正確”的直接答案。 但是有些事情要提防。 有些選擇取決於您的可靠性要求等。

例如,您想要一種不會“弄亂iis”的方法,指的是使正在處理請求的線程池餓死。 為此,您需要在線程池之外的線程上進行工作。 您可以根據自己的要求和測得的性能特征,以適合自己的方式進行操作。 您有兩個選擇:

  • 以某種方式啟動新線程-任務並行庫(TPL),新線程或其他。
  • 將報告生成托管在單獨的過程中(例如Windows服務)。

還有第三個選項可以使用您選擇的框架中內置的異步支持。 對於MVC,您具有異步控制器。 我沒有將此列為您的選擇,因為您說您不想在發送響應之前等待報告完成。 異步控制器/頁面在這里不會給您帶來任何好處,實際上會很受傷。

您還必須考慮可靠性方面的另一面:是的,您不想弄亂iis,但是您是否還擔心iis弄亂了您? 您的Web流程可以被回收,或者如果由於任何其他原因而停機,您的報告生成也會終止。 如果這對您很重要,則必須具有恢復機制或使主機脫離進程,以便對服務的可靠性進行單獨控制。

托管進程外的另一個好處是,您可以將該進程物理部署在與前端應用程序不同的服務器上。 然后,您可以進行優化以使用該應用程序中的線程池,而與前端無關。 如果您一次執行大量操作,這還將減少上下文切換。 此外,如果需要,您可以單獨擴展報告生成過程。 最后,您可以通過自動執行excel等方式分別處理權限和其他問題,如果這是您要解決的問題。

進程外的缺點是增加了復雜性。 無論您需要什么,您都需要在兩者之間進行一些通信,也許是WCF單向呼叫,也許是消息總線。 您需要權衡此成本,需求和可靠性/可擴展性等的期望值。

現在,對於您選擇進行異步工作的工具,很大程度上取決於您。 我認為,TPL是異步工作的一個很好的抽象,並且用於運行任務的默認任務計划程序在線程使用方面非常聰明,因此您不必對此進行過多考慮。 而且,.NET 4.5附帶了內置的編譯器支持,以使TPL的使用比今天更加簡單,並且看起來更像是同步樣式(搜索async / await或從此處開始示例)。

最重要的是,對於一般使用哪種技術,我不會太緊張或麻痹。 列出您的非功能性需求-性能,可伸縮性,可靠性等-確定哪些組合符合您的需求,然后選擇一個。 如果您擔心選擇錯誤,請嘗試以一種可以使您有效地應對這一領域的變化的方式設計解決方案。 如果需要,您可以隨時進行測量和更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM