現在、ASP.NET MVC(C#)プロジェクトを行っています。 Webサービスを使用しているコントローラのメソッド "index"があり、このコントローラのメソッドは値を返します。ここで、コードは次のとおりです。ASP.NET MVC(C#)のバックグラウンド計算
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();
}
「インデックス」ビュー、コントローラのインデックスメソッドによって返さViewBagの値を取得し、その後、「インデックス」ビューはViewBagの値が表示されます。 ただし、パフォーマンスに問題があります。 Webサービスの消費は時間がかかり過ぎるため、「インデックス」ビューを読み込んで終了するまでには時間がかかります。
他のスレッドで「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";
}
}
インデックスビューは、すでに前にページ全体をロードし終えていたとしてしかし、「インデックス」ビューは、コントローラの
インデックスメソッドによって返さViewBagを取得することができませんWebサービスの消費が完了します。 基本的に、まず、バックグラウンドで何かを処理していることを示すために、インデックスビューにローディング "GIF"を表示する必要があります。そして、Webサービスの消費が完了すると、インデックスビューは、コントローラのメソッドによって返されたビューバック値を表示します。
"テスト"をバックグラウンドでどのように実行でき、Webサービスの消費が完了した後、コントローラのインデックスメソッドによって返されたViewBagを表示するように "インデックス"ビューに通知します。
ジョブが完了する前にビューがレンダリングされ、返されるため、ビューをレンダリングする時間がWSに接触するのに比べて無視できる程度であるため、_asynchronous_サーバー側を作成できません。あなたがすべきことは、非同期クライアント側にすることです。そのコンテンツなしでビューをレンダリングし、クライアントからAJAX呼び出しを開始して必要なデータを収集します(最終的にはサーバー側でレンダリングされた部分ビューを使用することがあります) –
1 api呼び出しのない単純なビュー。 2 ajaxを呼び出して、部分的に(MVCコントローラ上で)返す3部分的なビュー –
[signalr](https://www.asp.net/signalr/overview/)を見てください。 Getting Started/Introduction to Signalr) –