我学习.NET,现在我正在学习使用ASP .NET MVC 4进行Web开发。
我做了一个任务:
Task t = new Task(new Action(() =>
{
while (convert("suitandtie.mp4") != 1)
{
if (i == 4)
{
// Here I want to access in mainthread property
// I need to change text for viewBag like :
// ViewBag.Message = "Convert failed";
// But I need a Dispatcher and invoke for accessing
// the ViewBag of the mainthread
break;
}
i++;
}
}));
t.Start();
在.Net Application中,使用System.Windows.Threading.Dispatcher,可以将它用于调用调用。 我在我的申请中这样做了:
this.Dispatcher.Invoke(new Action(() =>
{
ContactBook.Add(Person("Mark", "232 521 424"));
}));
当我在联系簿中添加Mark时,它在主线程的ContactBook中添加,而不是由Task创建的线程。
请帮助访问mainthread的ViewBag.Message吗?
答案 0 :(得分:0)
为什么需要将其创建为分离的线程?
我在问,因为除非客户端正在进行aysn调用,否则这样做没有任何好处,因为您不会同时执行许多操作并将控制器的执行推迟到其他服务。
如果您将当前Thread传递给ViewBag,最简单的方法就是。
答案 1 :(得分:0)
没有映射。没有办法与响应交互,因为响应已经[可能]已经发送,并且连接在那个时间点关闭。
如果您启动异步操作并且请求的上下文中没有阻止该操作,则该异步操作根本无法与响应进行交互。
您可以做的最好的事情是将您生成的任何内容的结果存储在某些外部存储机制(例如数据库)中,以便来自服务器的未来请求可以获取信息并将其发送到客户端
答案 2 :(得分:0)
Viewbag(以及任何页面状态)仅在将响应发送到客户端之前可用。这是经典的网络服务器模型的工作方式:客户端请求一个URL,服务器回答一些东西(HTML,javascript,octet Stream ......)如果你的操作只有几分钟,你应该考虑使用稍微不同的东西。
Personnaly,我会使用经典的ASP.NET MVC操作加载初始页面,然后通过后续的javascript请求启动长时间任务。
要运行任务,请使用SignalR之类的内容,这样您就可以在客户端和服务器之间进行双工通信。使用SignalR,服务器将能够轻松地在任务结束时通知客户端。它在ASP.NET MVC应用程序中使用非常简单。