2013-05-26 7 views
5

MVCプロジェクトでは、イメージの配列を生成し、セッション変数として配列を格納し、スライドバーを使用してイメージをアニメートし、マウスの動きを検出するマウスがキャンバス上を移動している間の最初のクリックとxの位置の間。私はアヤックスを使用するビューからMVC4 Ajaxが次のプロセスを実行する前に待機する

public ActionResult Animate(int slice = 0, int udm = 0) 
    { 
     FileContentResult data; 
     Image objImage = null; 
     Bitmap im = null; 
     try 
     { 
       im = MySession.Current.imageArray[slice]; 
       .... 
       MySession.Current.image = im; 
      } 
      else 
      { 
       return RedirectToAction("Index",new {.... }); 
      } 
     } 
     catch { } 
     return null; 
    } 

public ActionResult ImageOut(int udm = 0) 
     { 
      FileContentResult data; 
      Image objImage = null; 
      Bitmap im = null; 
      im = MySession.Current.image; 
      ... 
      objImage = im.Bitmap(outputSize, PixelFormat.Format24bppRgb, m); 
      MemoryStream ms1 = new MemoryStream(); 
      using (var memStream = new MemoryStream()) 
      { 
       objImage.Save(memStream, ImageFormat.Png); 
       data = this.File(memStream.GetBuffer(), "image/png"); 
      } 
      objImage.Dispose(); 
      return data; 
     } 

::私が使用して、コントローラで

私は2つの問題を抱えている

$.ajax({ 
    url: '/Home/Animate', 
    type: 'POST', 
    async: false, 
    data: { 
     slice: ((lastX - firstX) + nSlice), 
     udm: ++udm 
     }, 
    success: function(data) { 
    if (data.udm) { 
    nSlice = (data.slice); 
    image.src = '/Home/ImageOut?' + $.param({ 
    udm: data.udm 
    }); 
    } 
     }, 
     error: function() { 
      } 
     }); 

は、まずそれが更新するのに時間がかかりますビューといくつかの画像をスキップし、2番目は多くのスレッドを開いていると、同じページにアクセスするユーザーの数遅くなる。私はasyncを使用することを考えましたが、私はまだC#4を使用しています。これは私のコードに多くの変更を必要とするかもしれません。私はSignalRについて読んでいましたが、私の質問はこれを行うことができます(私はすべてのユーザーではなくユーザーの画面を更新するだけです)、またはより良い解決策があります。

私が達成したいイベントのシーケンスは次のとおりです。

  1. アヤックスはその後、アヤックスが成功を受け、最初のアクションにリクエストを送信したり、最初の画像を生成し、画像が生成されると
  2. を待ちます
  3. 第二のアクションを使用して画面上に画像を表示そして最初のアクションは、私が見る課題は、IMAを生成する第1の画像キープある

第2の画像を生成します私は最初のアクションの待ち時間をどのようにして、それに次のイメージを生成するためのメッセージを送るのかということです。

私はVS2012 C#5をインストールしましたが、私に役立つ例はありますか?おかげさまで、あなたの提案を感謝します。 TPLを使用して

+0

SignalRは、1-1メッセージで必要と思われるものと比べて、1対多のメッセージ、購読/公開/ブロードキャストに最適なソリューションです。 async/awaitを利用するには、.NET 4.5へのアップデートは問題ありません。それ以外の場合は、TPL(Task Paralell Library)を.NET 4フレームワークのTask.Factory.StartNewメソッドで常に使用できます。 – ianaldo21

+0

残念ながら、VS2010は4.5をサポートしていません。 – hncl

+0

これは問題ありません.TPLを試してみましたか? – ianaldo21

答えて

0
のためだけの省略形です

学習曲線のためにTPLを使用するようにプログラムを変更するのではなく、私はasync:ajaxにfalseを追加しました。これは画面のリフレッシュを遅らせるのに役立ちました。最高のアプローチではなく、少し助けました。

0

、あなたが(上記のコードを取って)これを試みることができる、同じアニメーション化法に適用することができます。

 public ActionResult ImageOut(int udm = 0) 
     { 
      FileContentResult data = null; 
      Image objImage = null; 
      Task.Run(() => 
       { 
        Bitmap im = MySession.Current.dicomImage; 
        objImage = im.Bitmap(outputSize, PixelFormat.Format24bppRgb, m); 
        using (var memStream = new MemoryStream()) 
        { 
         objImage.Save(memStream, ImageFormat.Png); 
         data = this.File(memStream.GetBuffer(), "image/png"); 
        } 
       }); 
      objImage.Dispose(); 
      return data; 
     } 

Task.RunはTask.Factory.StartNew

+0

ianaldo21ありがとうございます。そのため、両方のアクションにTask.Run()を追加すると問題が解決します! 私はmenthodをアニメーション化するためにajaxを使用してビューアからコマンドを送信します。完了すると、イメージファイルをImageOutメソッドに送信し、出力イメージはajax成功を使用して表示し、次に2番目のイメージを表示します。処理されます。 – hncl

+0

次のエラーが発生しました。 'System.Threading.Tasks.Task'に 'Run'の定義が含まれていません。 – hncl

関連する問題