在异步任务期间刷新部分视图

时间:2014-06-12 14:25:48

标签: c# ajax asp.net-mvc asp.net-mvc-5

我正在使用ASP.NET MVC5应用程序中的脚本。这个脚本正在处理15.000个文件,所以我不想等到最后刷新我的视图。

我的问题是我想在异步任务期间刷新我的视图。

我尝试了很多解决方案,比如使用AJAX在我的任务中重新加载我的局部视图,但是当我启动我的脚本时,它会阻止evrything并且永远不会刷新我的视图直到这个脚本结束。

我的代码:

查看

@{
    ViewBag.Title = "ConvertScript";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>ConvertScript</h2>

<div id="PartialDiv">
    @{Html.Partial("getStatus");}
</div>

@section Scripts
{
    @Scripts.Render("~/Scripts/jquery.unobtrusive-ajax.min.js")
    <script type="text/javascript">
        $(function () {
            setInterval(function () { $('#PartialDiv').load('/Annotation/Refresh'); }, 1000); // every 3 sec
        });
    </script>
}

控制器

 public string testOut(int callDuration, out int threadId)
        {
            var File = from m in db.Annotations where m.IsDocument == true select m;
            int i;
            for (i = 0; i < 100; ++i)
            {
                Annotation item = File.OrderBy(t => t.FileSize).Skip(i).Take(1).Single();
                using (FileStream stream = new FileStream("C:\\Users\\administrator\\Documents\\Visual Studio 2013\\Projects\\Files\\" + item.FileName, FileMode.Create, FileAccess.ReadWrite))
                {
                    byte[] fileContent = Convert.FromBase64String(item.DocumentBody);
                    Debug.Write("Doing item nb : " + i + " Filename : " + item.FileName + "\n");
                    stream.Write(fileContent, 0, fileContent.Length);
                    stream.Close();
                    Session["count_files"] = (int)Session["count_files"] + 1;
                }
            }
            threadId = Thread.CurrentThread.ManagedThreadId;
            return ("Yes");
        }

        public delegate string AsyncMethodCaller(int callDuration, out int threadId);

        [OutputCache(NoStore = true, Location = OutputCacheLocation.Client, Duration = 1)]
        public ActionResult Refresh()
        {
            Debug.Write("Refresh " + Session["State"] + "\n");
            if ((int)Session["State"] == 2)
            {
                Debug.Write("In\n");
                int threadId;
                AsyncMethodCaller caller = testOut;
                IAsyncResult result = caller.BeginInvoke(10, out threadId, null, null);
                string res = caller.EndInvoke(out threadId, result);
            }
            Session["State"] = (int)Session["State"] + 1;
            ViewData["count_file"] = (int)Session["count_files"];
            return PartialView("getStatus");
        }

有没有人有这个想法呢?

谢谢, 奥利弗

1 个答案:

答案 0 :(得分:0)

您可以使用SignalR以异步方式从服务器向客户端发送数据。基本上,SignalR是Microsoft实现的多种方法(几乎每个浏览器都有后备),允许双向通信,这可能就是您所需要的。

我建议你学习它。您可以在此处阅读相关内容:http://signalr.net/MVA上有一些有关SignalR的内容。文档是here,它似乎提供了很多教程来帮助您入门。祝你好运。