0

我学习 .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 应用程序中,使用 System.Windows.Threading.Dispatcher,可以将其用于调用调用。我在我的应用程序中这样做了:

 this.Dispatcher.Invoke(new Action(() =>
  {
      ContactBook.Add(Person("Mark", "232 521 424"));
  }));

当我在通讯录中添加 Mark 时,它添加在主线程的 ContactBook 中,而不是 Task 创建的线程中。

请帮助访问主线程的 ViewBag.Message ?

4

3 回答 3

0

为什么需要将其创建为单独的线程?

我之所以问是因为除非客户端正在进行aysn调用,否则这样做没有任何好处,因为您不会同时做很多事情并将控制器的执行推迟到其他一些服务。

如果您想将当前线程传递给 ViewBag,那么最简单的方法是。

于 2013-04-03T14:03:36.893 回答
0

Viewbag(和任何页面状态)仅在响应发送到客户端之前可用。这是经典网络服务器模型的工作方式:客户端请求 URL,服务器响应某些内容(HTML、javascript、八位字节流...) 如果您的操作长达几分钟,您应该考虑使用稍微不同的东西。

个人而言,我会使用经典的 ASP.NET MVC 操作加载初始页面,然后通过后续的 javascript 请求启动长时间任务。

要运行该任务,请使用SignalR之类的东西,这将使您能够在客户端和服务器之间执行双工通信。使用 SignalR,服务器将能够在任务结束时相当轻松地通知客户端。它在 ASP.NET MVC 应用程序中非常容易使用。

于 2013-04-03T14:40:42.413 回答
0

没有映射。无法与响应交互,因为响应已经 [可能] 已经发送并且连接在那个时间点关闭。

如果您启动一个异步操作并且在请求的上下文中没有阻止该操作的内容,那么该异步操作根本无法与响应交互。

您能做的最好的事情是将您生成的任何结果存储在某个外部存储机制(例如数据库)中,以便将来来自服务器的请求可以获取信息并将其发送到客户端。

于 2013-04-03T14:33:12.813 回答