我正在使用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");
}
有没有人有这个想法呢?
谢谢, 奥利弗
答案 0 :(得分:0)
您可以使用SignalR以异步方式从服务器向客户端发送数据。基本上,SignalR是Microsoft实现的多种方法(几乎每个浏览器都有后备),允许双向通信,这可能就是您所需要的。
我建议你学习它。您可以在此处阅读相关内容:http://signalr.net/,MVA上有一些有关SignalR的内容。文档是here,它似乎提供了很多教程来帮助您入门。祝你好运。