2016-04-13 9 views
2

データコードからメソッドを非同期に呼び出そうとすると、次の2つのエラーが表示されます。WebAPI非同期メソッドエラー

これらのエラーを発生させずにメソッドを非同期に呼び出す方法はありますか?

  • System.Runtime.CompilerServices.IAsyncStateMachineは」が定義されていないか、またはインポート

  • は、必要なすべての種類を見つけることができません '非同期' 修飾子を。 あなたは間違ったフレームワークバージョンをターゲットにしていますか、 アセンブリへの参照がありませんか?

APIProject.DAL

public class Account : BaseLayer 
{ 
    public static Result SignIn(string userName, string userPass) 
    { 
     var inputParameters = new Dictionary<string, object>(); 
     inputParameters.Add("IN_USERNAME", userName); 
     inputParameters.Add("IN_USERPASS", userPass); 
     var response = ListStoredProcedure(Procedure.SignIn, inputParameters); 
     var resultSet = new List<User>(); 
     foreach (DataRow row in response.DataTable.Rows) 
     { 
      resultSet.Add(new User 
      { 
       UserId = row.GetVarchar("USERID"), 
       Fullname = row.GetVarchar("FULLNAME") 
      }); 
     } 
     return new Result 
     { 
      HasResult = response.HasResult, 
      Message = response.Message, 
      ResultSet = resultSet 
     }; 
    } 
} 

APIProject.WebAPI

using System.Threading.Tasks; 
public class AccountController : ApiController 
{ 
    public async Task<Result> SignIn(LogInModel model) 
    { 
     Result r = APIProject.DAL.Account.SignIn(model.UserName, model.UserPass); 
     return await Task.Factory.StartNew<Result>(() => r); 
    } 
} 
+0

コードで 'async'を使用する理由はありません。何も達成されません。あなたができるので、それは非同期です。 – Maarten

答えて

1

私はあなたのコードが古い.NET Frameworkのバージョンを対象と思います。少なくとも.NET 4.5をターゲットにする必要があります。プロジェクトのターゲットを変更したくない場合は、Microsoft.Bcl.Async NuGetパッケージをインストールして、古いバージョンの.NETでasync\awaitを使用することができます。

+0

ありがとうございます、あなたの権利は細かく私は4.5としてフレームワークのバージョンを変更すると動作します。また、私は自分のコードがaproachingについての質問をしたい。非同期メソッドのための正しい方法ですか? –

+1

いいえ、やっていることは悪い習慣です。 ASP.NETで 'SignIn()'を 'Task'にラップしても、あなたは利益を得られません。さらに、不要なコンテキストの切り替えによってコードがさらに遅くなる可能性が非常に高いです。 WPFとは異なり、ASP.NETでは、インターネット経由でのデータの送受信、ファイルの読み込みや書き込み、DBへのアクセスなど、I \ O操作にのみasync \ awaitを使用する必要があります。 –

1

あなたはエラーに

を取得するには「System.Runtime.CompilerServices.IAsyncStateMachine」あなたは間違った.NETフレームワークのバージョンを対象とする場合

をインポート定義または されていません。あなたは.NET 4.5にアプリケーションをターゲットにする必要がありますボックス(最低でも)

+0

ありがとう、私はちょうど4.5としてフレームワークのバージョンに変更しました。それは細かく動作します。 –

2

の外に動作するように非同期のためにあなたは、.NET 4.5以上、set httpRuntime.targetFramework in your web.config to the appropriate valueにプロジェクトを更新する必要があります。

あなたは、この第二のステップをスキップした場合、async/awaitをコンパイルしますが、正常に動作しない場合があります。

+0

ありがとうございます、私はすでにasync WebAPIに関するリソースを検索すると、今日のあなたのWebページを見ました:) –