异步任务期间刷新局部视图
本文关键字:视图 刷新局 任务 异步 | 更新日期: 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的内容。文档在这里,它似乎提供了很多入门教程。祝你好运。