2013-03-18 49 views
4

我在我的MVC3應用程序中使用Rotativa將pdf生成爲內存流,然後通過電子郵件附件將其發送至電子郵件。這工作正常,但它很慢(約5至7秒,只有1個用戶),所以我一直試圖把它放入一個單獨的線程,以便用戶不會受到巨大的延遲卡住。MVC3將ControllerContext傳遞給線程?

我一直面臨的問題是,Rotativa需要控制器上下文將數據生成到內存流中,這意味着如果您嘗試將其放入單獨的線程並向用戶返回通知,那麼上下文被處置並且pdf生成將失敗。

不幸的是,我在服務器端做了一個電子郵件驗證檢查,並在適當的情況下返回true/false,false將提示用戶修復它並重試。這意味着我不能僅僅假設電子郵件總是有效的(我可以通過jquery來完成,但如果它們關閉並嘗試提交,它們將不會收到錯誤消息)。

到目前爲止,我曾嘗試:

  • 創建一個新的線程,並傳遞上下文中
  • 將其複製到一個新的變量
  • 序列化的背景下複製的背景下,物流進入新線程和反序列化(遺憾的是上下文不可序列化)

有沒有人有任何其他的想法?

+0

你有沒有想過這個?我面臨着同樣的情況,目前還沒有解決辦法。謝謝 – SouthPlatte 2015-09-30 21:22:10

+0

@SouthPlatte不幸的是,我無法找到一個直接的修復。我只是再看看我的設置,在我的情況下,我確實有一個潛在的解決方法。請注意,這適用於我的情況,因爲自動發送電子郵件失敗的情況非常罕見,如果發生這種情況,用戶不知道他們的客戶是否收到了電子郵件。 您可以假定流程成功完成並立即向用戶返回成功消息,然後執行處理。 – Dratta 2015-10-02 23:08:45

回答

0

下面是我在背景中使用背景進行漫長過程的過程。我正在使用由數據庫支持的自定義會話。您需要將所需的任何值傳遞給「背景」操作。

using (var client = new WebClient()) 
{ 
    var values = new NameValueCollection 
    { 
     { "sessionid", DataSession.Id.ExtractSid() } 
    }; 
    client.UploadValuesAsync(new Uri(Url.AbsoluteAction("ResultsCallback", "Quote")), values); 
}