MVC4 Ajax在执行下一个进程之前等待

时间:2013-05-26 07:43:24

标签: ajax asp.net-mvc async-await

在我的MVC项目中,我生成一个图像数组并将数组存储为会话变量,我使用滑动条为图像设置动画,并通过计算第一次单击和x位置之间的距离来检测鼠标按键时的鼠标移动。鼠标在画布上移动。

在我使用的控制器中:

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. Ajax向第一个操作发送请求或生成第一个图像并等待
  2. 生成图像时,Ajax会收到成功,然后使用第二个操作
  3. 在屏幕上显示图像
  4. 然后第一个动作生成第二个图像
  5. 我看到的挑战是第一张图片在不等待的情况下继续生成图像,所以我的问题是如何让第一个动作等待,以及如何向其发送消息以生成以下图像。

    我刚刚安装了VS2012 c#5,有什么例子可以帮助我!!非常感谢您的建议,谢谢。

2 个答案:

答案 0 :(得分:0)

使用TPL,您可以尝试这个(上面的代码),同样可以应用于animate方法:

        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

的简写

答案 1 :(得分:0)

而不是因为学习曲线而改变我的程序以使用TPL;我刚刚向我的ajax添加了async:false;这有助于延迟刷新屏幕。不是最好的方法,但有点帮助。