我目前正在做一个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的更多信息