ASP的后台计算.. Net MVC (c#)



我目前正在做一个ASP。. NET MVC (c#)项目。我有一个名为"index"的控制器方法,它正在使用web服务,这个控制器的方法将返回一个值。代码如下:

  public ActionResult index()
 {
     ContactlessTerminal.wsContactlessTerminal objContactlessTerminal = new ContactlessTerminal.wsContactlessTerminal();
        string strMessage = objContactlessTerminal.fnMakeContactlessPayment(); 
        if (strMessage.Equals("00"))
        {
            ViewBag.Message = "00";
        }
        else if(strMessage.Equals("11"))
        {
            ViewBag.Message = "11";
         } 
    return View(); 
 }

"index"视图将检索由控制器的index方法返回的ViewBag的值,然后"index"视图将显示ViewBag的值。但是,存在一些性能问题。web服务的消耗时间太长,因此需要一些时间才能使"index"视图加载完成。

因此,我试图通过将"正在使用web服务的代码"放在另一个线程中来修改代码。代码如下:

         public ActionResult index()
         {
              Thread thread = new Thread(testing);
              thread.Start();
              return View();
          }
           public void testing()
           {
                  ContactlessTerminal.wsContactlessTerminal objContactlessTerminal = new ContactlessTerminal.wsContactlessTerminal();
                string strMessage =  objContactlessTerminal.fnMakeContactlessPayment(); 
           if (strMessage.Equals("00"))
           {
              ViewBag.Message = "00";
           }
            else if(strMessage.Equals("11"))
           {  
            ViewBag.Message = "11";
           }   

            }

但是,"index"视图将无法检索由
返回的ViewBag。作为索引视图的控制器的Index方法,在完成web服务的消费之前已经完成了整个页面的加载。基本上,首先,我想在索引视图中显示一个正在加载的"GIF"来表明它正在后台处理一些东西。当web服务消费完成后,索引视图将显示由控制器的方法返回的viewbag值。

谁能告诉我如何在后台运行方法"testing",在web服务消费完成后,它将通知"index"视图显示由控制器的index方法返回的ViewBag

运行一个单独线程的目的是什么?如果您不能立即返回视图,并且必须等待task的结果,那么在后台运行它是没有意义的。

如果你想释放一些资源(即线程),如果你的长时间运行的进程正在等待网络上的一些服务,你将不得不使你的控制器动作异步,并在一个单独的任务中运行你的后台线程,例如:

return await Task.Run(testing());

如果你要做一些繁重的计算或不想麻烦,你可以使用

Task.Run(testing()).Wait();

尽管像我之前提到的那样做是没有意义的。

如果你真的想在客户端实现更新,你只需要进行普通的web api调用,并在客户端使用AJAX调用它,最好使用一些框架,如Knockout, Angular, React等。

您可以在。net中使用async模式。例如:

private Task<string> MakeContactlessPaymentAsync()
{
     TaskCompletionSource<string> tcs = new TaskCompletionSource<string>();
     Task.Run(() =>
     {
         ContactlessTerminal.wsContactlessTerminal objContactlessTerminal = 
              new ContactlessTerminal.wsContactlessTerminal();
         var strMessage = objContactlessTerminal.fnMakeContactlessPayment();
         tcs.SetResult(strMessage);
      });
     return tcs.Task;
}
public async Task<ActionResult> GizmosAsync()
{
    var result = await MakeContactlessPaymentAsync();       
    return View(result); //return the string as a model for that view
}

编辑

MVC async的更多信息

最新更新