0

私は非同期を使用していて、コントローラーで待機しています。

次のコードは正常に機能します

[HttpPost]
[ValidateAntiForgeryToken]        
public async Task<ActionResult> Create(CompetitionViewModel viewModel)
{
        if (ModelState.IsValid)
        {

            User user = null;
            using (var facebookClient = new FacebookClient(viewModel.AccessToken))
            {
                var facebookUser = await facebookClient.Me();
                user = entityStorage.GetUser(facebookUser);
                FormsAuthentication.SetAuthCookie(user.FacebookId, true);
            }

ただし、extensionメソッドで同じコードを実行しようとすると、awaitが完了しません。

[HttpPost]
[ValidateAntiForgeryToken]        
public ActionResult Create(CompetitionViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        var user = entityStorage.GetCurrentUser(viewModel.AccessToken).Result;

public static class Helpers
    {
        public async static Task<User> GetCurrentUser(this IEntityStorage entityStorage, string accessToken)
        {
            User user = null;
            using (var facebookClient = new FacebookClient(accessToken))
            {
                var facebookUser = await facebookClient.Me(); //STUCK HERE!!
                user = entityStorage.GetUser(facebookUser);
                FormsAuthentication.SetAuthCookie(user.FacebookId, true);
            }
            return user;
        }

私はMVC4を使用しており<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />、他のスレッドの提案に従ってweb.configに設定しています。

なぜこれがなぜであり、どうすればそれを機能させることができるのか誰かに教えてもらえますか?

4

1 に答える 1

1

これについて詳しく説明したブログ投稿があります。

つまり、 を呼び出してデッドロックを引き起こしていますResult。代わりに、Createメソッドを作成し、ユーザーを取得するためにasync使用します。await

[HttpPost]
[ValidateAntiForgeryToken]        
public async Task<ActionResult> Create(CompetitionViewModel viewModel)
{
  if (ModelState.IsValid)
  {
    var user = await entityStorage.GetCurrentUser(viewModel.AccessToken);
于 2012-07-18T17:21:29.967 に答える