异步任务期间刷新局部视图

本文关键字:视图 刷新局 任务 异步 | 更新日期: 2023-09-27 18:08:16

我正在制作一个脚本,它是在一个ASP。NET MVC5应用。这个脚本正在处理15000个文件,所以我不想等待结束来刷新我的视图。

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

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

我的代码: 视图

@{
    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");
        }

谁有这样做的主意?

谢谢,奥利弗

异步任务期间刷新局部视图

您可以使用SignalR在异步方法中将数据从服务器发送到客户端。基本上,SignalR是微软多种方法的实现(几乎每个浏览器都有回退),允许双向通信,这可能是你正在寻找的。

我建议你学习它。你可以在这里阅读:http://signalr.net/, MVA上有一些关于SignalR的内容。文档在这里,它似乎提供了很多入门教程。祝你好运。