2013-05-26 39 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; 
     } 

從視圖我使用Ajax:

$.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() { 
      } 
     }); 

我有兩個問題,首先,它需要時間來更新查看並跳過一些圖片,其次是它打開很多線程,如果有多個用戶訪問同一頁面的話慢下來。我想過使用異步,但我仍然使用C#4,這可能需要對我的代碼進行很多更改。我正在閱讀有關SignalR,我的問題是可以做到這一點(只要我更新用戶屏幕不是所有用戶)或者是否有更好的解決方案。

我想實現的事件順序是:

  1. 阿賈克斯發送到第一動作的請求或生成第一映像,並等待
  2. 當生成圖像,阿賈克斯獲得成功,然後使用所述第二動作
  3. 然後第一動作生成所述第二圖像顯示在屏幕上的圖像

我看到的挑戰是所述第一圖像保持生成伊馬ges沒有等待,所以我的問題是我如何讓第一個動作等待,以及如何發送消息來生成下面的圖像。

我剛剛安裝VS2012 C#5,有沒有例子,可以幫助我!希望你的建議,在此先感謝。

+0

SignalR是1對多的消息很好的解決方案,認購/相比之下發布/廣播到什麼好像你需要用一個1-1的消息。更新到.NET 4.5以使用異步/等待應該沒有問題。否則,您可以使用.NET 4框架中的Task.Factory.StartNew方法始終使用TPL(Task Paralell Library)。 – ianaldo21

+0

謝謝,不幸的是VS2010不支持4.5。 – hncl

+0

這很好,你嘗試過TPL嗎? – ianaldo21

回答

0
速記

而不是改變我的程序使用TPL,因爲學習曲線;我剛剛添加async:false到我的ajax;這有助於延遲屏幕刷新。不是最好的方法,但有一點幫助。

0

使用TPL,你可以試試這個(取上面的代碼),同樣可以應用在動畫的方法:

 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()添加到這兩個操作將解決問題!只是爲了確定下列情況: 我使用ajax發送命令給動畫播放器,播放完成後,它將圖像文件發送到ImageOut方法,輸出圖像使用ajax成功顯示,然後第二個圖像將被處理。 – hncl

+0

我收到以下錯誤: 'System.Threading.Tasks.Task'不包含'Run'的定義, – hncl