TimeoutException на AsyncController в среде HyperV - PullRequest
2 голосов
/ 27 сентября 2010

Мы получаем исключение TimeoutException для MVC AsyncController в нашей среде Beta HyperV. Все работает нормально при локальной отладке, но при развертывании в подготовительной среде мы получаем эту ошибку:

[TimeoutException: истекло время ожидания операции.] System.Web.Mvc.Async.WrappedAsyncResult`1.End () +129 System.Web.Mvc.Async. <> C_ DisplayClass39.b _38 (IAsyncResult asyncResult) +23 System.Web.Mvc.Async. <> C_ DisplayClass33.b _2d () +125 System.Web.Mvc.Async. <> C_ DisplayClass49.b _43 () +452 System.Web.Mvc.Async. <> C_ DisplayClass49.b _43 () +452 System.Web.Mvc.Async. <> C_ DisplayClass49.b _43 () +452 System.Web.Mvc.Async. <> C_ DisplayClass31.b _30 (IAsyncResult asyncResult) +15 System.Web.Mvc.Async. <> C_ DisplayClass24.b _1a () +31 System.Web.Mvc.Async. <> C_ DisplayClass1f.b _1c (IAsyncResult asyncResult) +230 System.Web.Mvc. <> C_ DisplayClass17.b _12 (IAsyncResult asyncResult) +28 System.Web.Mvc.Async. <> C_ DisplayClass4.b _3 (IAsyncResult ar) +20 System.Web.Mvc.AsyncController.EndExecuteCore (IAsyncResult asyncResult) +53 System.Web.Mvc.Async. <> C_ DisplayClass4.b _3 (IAsyncResult ar) +20 System.Web.Mvc. <> C_ DisplayClass8.b _3 (IAsyncResult asyncResult) +42 System.Web.Mvc.Async. <> C_ DisplayClass4.b _3 (IAsyncResult ar) +20 System.Web.CallHandlerExecutionStep.OnAsyncHandlerCompletion (IAsyncResult ar) + 136

    [OutputCache(Duration = 0, NoStore = true, VaryByParam = "")]
            public void IndexAsync()
            {
                using (var context = Repository.CreateContext().CreateUnitOfWork())
                {
                    user = context.Users.Single(u => u.Username == User.Identity.Name);

                        AsyncManager.OutstandingOperations.Increment();

                        ThreadPool.QueueUserWorkItem(o => {
                            var sync = myService.DoThingsAsync(user);
                            sync.AsyncWaitHandle.WaitOne();
                            AsyncManager.OutstandingOperations.Decrement();  
                        });
                }
            }

/// IndexCompleted is never called
     public ActionResult IndexCompleted(string property)
            {
                using (var context = Repository.CreateContext().CreateUnitOfWork())
                {
                    var user = context.Users.Single(u => u.Username == User.Identity.Name);

                    var model = new MyViewModel
                    {
                        ModelProperty = user.Property
                    };

                    return View("Index", model);
                }
            }

Каковы возможные причины этой ошибки?

1 Ответ

9 голосов
/ 24 октября 2010

Это исключение, которое выдается, когда асинхронное действие занимает больше времени, чем настроенное значение AsyncTimeout (по умолчанию 45 секунд). Вы можете явно контролировать это значение, украсив свой ActionMethod атрибутом AsyncTimeout. Например, чтобы установить тайм-аут асинхронного режима на полную минуту:

[AsyncTimeout(60000)]
public void IndexAsync()
{
   ...
}

Вы также можете использовать атрибут NoAsyncTimeout, но вы будете подвержены асинхронным действиям, никогда не завершающим и не оставляющим ваши веб-запросы в подвешенном состоянии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...