2016-11-04 17 views
0

現在、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を表示するように "インデックス"ビューに通知します。

+2

ジョブが完了する前にビューがレンダリングされ、返されるため、ビューをレンダリングする時間がWSに接触するのに比べて無視できる程度であるため、_asynchronous_サーバー側を作成できません。あなたがすべきことは、非同期クライアント側にすることです。そのコンテンツなしでビューをレンダリングし、クライアントからAJAX呼び出しを開始して必要なデータを収集します(最終的にはサーバー側でレンダリングされた部分ビューを使用することがあります) –

+0

1 api呼び出しのない単純なビュー。 2 ajaxを呼び出して、部分的に(MVCコントローラ上で)返す3部分的なビュー –

+0

[signalr](https://www.asp.net/signalr/overview/)を見てください。 Getting Started/Introduction to Signalr) –

答えて

-2

asyncのパターンは.Netで使用できます。たとえば、次のように

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 
} 

EDIT

More info on MVC async

+0

これは、ビューのレンダリングに役立ち、非同期の結果に基づいてビューを更新するために、どのように役立ちますか? – Charleh

+0

これは、.NETで非同期プログラミングがどのように機能するかを完全に誤解しています。私はそれがどのように動作するかを見直し、将来、誤った情報が広がらないように注意することをお勧めします。 – mason

+0

@masonあなたはもっと具体的になることができますか?私はMVCで使用されているような方法を見てきましたが、問題はありませんでした。 –

-1

あなたのために別のスレッドを実行する目的は何ですか?すぐにビューを返せず、タスクの結果を待たなければ、バックグラウンドで実行する必要はありません。

あなたには、いくつかのリソース(すなわちスレッド)を解放したい場合は、あなたの実行時間の長いプロセスは、ネットワークを介していくつかのサービスを待っている場合、あなたはアクション非同期のコントローラおよび個別のタスクであなたのバックグラウンドスレッドを実行させる必要があります、例えば:

あなたには、いくつかの重い計算を行うか、気にする習慣ない場合、私は前に述べたように、実際にそれを行うにはポイントがありませんけれども
return await Task.Run(testing()); 

、あなただけ

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

を使用することができます。

本当にクライアント側で更新を実現したいのであれば、通常のWeb API呼び出しを呼び出し、クライアント側からAJAXを使用してコールする必要があります。ノックアウト、角度、リアクションなどのフレームワークを使用することをお勧めします。