Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET MVC(C#)中的后台计算_C#_Asp.net_Asp.net Mvc - Fatal编程技术网

ASP.NET MVC(C#)中的后台计算

ASP.NET MVC(C#)中的后台计算,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我目前正在做一个ASP.NETMVC(C#)项目。我有一个名为“index”的控制器方法,它正在使用一个web服务,该控制器的方法将返回一个值。代码如下: public ActionResult index() { ContactlessTerminal.wsContactlessTerminal objContactlessTerminal = new ContactlessTerminal.wsContactlessTerminal(); string st

我目前正在做一个ASP.NETMVC(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(); 
 }
         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";
           }   


            }
“索引”视图将检索控制器索引方法返回的ViewBag值,“索引”视图将显示ViewBag值。 但是,存在一些性能问题。web服务的使用时间太长,因此需要一些时间才能完成“索引”视图的加载

因此,我试图通过将“使用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(); 
 }
         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";
           }   


            }
但是,“索引”视图将无法检索用户返回的视图包
作为索引视图的控制器的索引方法在web服务的使用完成之前已经完成了整个页面的加载。 基本上,首先,我想在索引视图中显示一个正在加载的“GIF”,以表明它正在后台处理某些内容。当web服务消费完成时,index视图将显示控制器方法返回的viewbag值


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

您可以使用.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
}
private任务MakeContactlessPaymentAsync()
{
TaskCompletionSource tcs=新的TaskCompletionSource();
Task.Run(()=>
{
ContactleSterminal.wsContactleSterminal对象ContactleSterminal=
新的ContactlessTerminal.wsContactlessTerminal();
var strMessage=objContactlessTerminal.fnMakeContactlessPayment();
tcs.SetResult(strMessage);
});
返回tcs.Task;
}

公共异步任务。

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

如果要释放一些资源(即线程),如果长时间运行的进程正在网络上等待某些服务,则必须使控制器操作异步,并在单独的任务中运行后台线程,例如:

return await Task.Run(testing());
如果你做了一些繁重的计算或者不想麻烦,你可以使用

Task.Run(testing()).Wait();
尽管像我之前提到的那样,这样做没有任何意义


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

您不能进行异步服务器端,因为视图将(可能)在作业完成之前呈现和返回(与联系WS相比,渲染视图的时间应该可以忽略不计)。您应该做的是使其成为异步客户端。在没有该内容的情况下渲染视图,并从客户端启动AJAX调用以收集所需数据(最终您可以使用服务器端渲染的部分视图)1个没有api调用的简单视图。2个对视图进行ajax调用以返回部分(在mvc控制器上)3返回api调用结果的部分视图或者,看看这如何帮助您呈现视图,然后根据异步结果更新视图?这完全是对.NET中异步编程工作原理的误解。我建议您回顾它的工作原理,小心不要在将来传播有关它的错误信息:如果没有坏信息,异步已经够难的了。@mason你能说得更具体一点吗?我在MVC中见过这样的方法,而且没有问题。这不会帮助视图更快地返回到客户端。对web服务的调用需要一定的时间,而这段时间不会因为它在任务中运行而改变。TGizmosAsync函数的返回速度不会更快。事实上,由于引入了开销(不是很多,但有一点),它现在可能会更慢。