2012-05-10 15 views
1

私は電子メールの束の火災以下のようなコントローラがあります。MVC爽やかビュー

public ActionResult Index() 
    { 
     ViewBag.Message = "Email Results."; 

     emailQueue.emailQueueCompleted += EmailsCompleted; 
     emailQueue.Run(); 


     List<EmailError> emails = new List<EmailError>(); 


     return View(emails); 
    } 

しかしemailQueue.Run()がまだビューがレンダリングされる時までに完了していない非同期タスクです。とにかく、私の質問は、私は、電子メールキューの後にエラーの最新リストを取り戻すたら、私は簡単にこのコントローラでビューを再レンダリングすることができている

public void EmailsCompleted(List<EmailError> errors) 
    { 
     if (errors.Count > 0) 
     { 
      // Do some stuff 

      // Re-render view with updated errors if possible 
     } 
    } 

:それは、その後完了したとき、それは以下の同じコントローラでこのメソッドを呼び出しますタスクを完了しましたか?また、最初にビューをレンダリングしようとする前に、メールが完了するのを待つ必要があります(これは、かなり長い時間がかかる可能性があることに注意してください)。 MVCは通常、私が掘り下げたいと思っているエリアではないので、いつものように提案を歓迎します。

+0

http://www.codeproject.com/Articles/377394/ElmahR-equals-ELMAH-plus-SignalRこれはMVCとsingalRを使ったプロジェクトで、あなたのニーズに似たものです。 – Joe

答えて

0

あなたのアーキテクチャは少し賢明ではないようです。実行が完了したときに表示するためにクライアント側の更新をどのように行うことができますか?

周囲を変えることを検討する必要があります。最初にビューをレンダリングし、次にいくつかのajaxを呼び出して電子メールの送信を開始します。このページは、Eメールが送信されると応答を戻します(長く待つようにAjax呼び出しのタイムアウトを設定することを覚えておいてください)。その後、新しい要素を適切にレンダリングできます。

さらに

一般的に、この種のものはおそらく、Webアプリケーションのうち最高の左側で、Windowsのサービスに適しています。 DB状態に基づいてページを介してバッチ送信のステータスを示すページをレンダリングするだけです。