4

非同期プログラミングのベスト プラクティスを読んだ後 、MVC4 でデッドロックの動作をテストすることにしました。イントラネット テンプレートから Web サイトを作成した後、Index アクションを次のように変更しました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;

namespace AsyncAwait.MVC4.Controllers
{
    public class HomeController : Controller
    {
        private static async Task DelayAsync()
        {
            await Task.Delay(1000);
        }

        // This method causes a deadlock when called in a GUI or ASP.NET context.
        public static void Test()
        {
            // Start the delay.
            var delayTask = DelayAsync();
            // Wait for the delay to complete.
            delayTask.Wait();
        }

        public ActionResult Index()
        {
            ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";

            Test();

            return View();
        }
    }
}

Index の呼び出しは予期したとおりにハングしますが、ある時点で例外がスローされることも予期していました。ただし、例外がスローされることはなく、すべてのリクエストがハングするだけです。

利用可能なすべてのパフォーマンス カウンターを調べましたが、デッドロックを特定する方法がわかりませんでした。async/await を使用する既存の Web サイトで作業する場合、潜在的なデッドロックの監視をどのようにセットアップできますか?

ありがとう!

4

1 に答える 1

0

予測可能な時間内にタスクが完了すると予想される場合は、タイムアウトを使用できます。

Task.Waitタイムアウト値を取るオーバーロードがいくつかあります。

たとえば、タスクに 5 秒以上かかることがない場合は、次のようなことができます。

var delayTask = DelayAsync();

// Will be true if DelayAsync() completes within 5 seconds, otherwise false.
bool callCompleted = delayTask.Wait(TimeSpan.FromSeconds(5));

if (!callCompleted)
{
    throw new TimeoutException("Task not completed within expected time.");
}
于 2013-04-01T17:57:32.747 に答える