Ошибка в MVC3 - запросы никогда не заканчиваются. Работает нормально для ASPX-страниц в том же проекте

Альтернативой AtomicInteger (или любому другому объекту, способному сохранить значение) является использование массива:

final int ordinal[] = new int[] { 0 };
list.forEach ( s -> s.setOrdinal ( ordinal[ 0 ]++ ) );

Но см. ответ Стюарта : там может быть лучшим способом справиться с вашим делом.

30
задан Scott 1 September 2011 в 04:09
поделиться

2 ответа

Я нашел причину для этого, methinks:

Этот метод находится в классе WrappedAsyncResult, который класс MvcHandler использует через BeginProcessRequest:

public static IAsyncResult BeginSynchronous<TResult>(AsyncCallback callback, object state, Func<TResult> func, object tag)
{
    BeginInvokeDelegate beginDelegate = delegate (AsyncCallback asyncCallback, object asyncState) {
        SimpleAsyncResult result = new SimpleAsyncResult(asyncState);
        result.MarkCompleted(true, asyncCallback);
        return result;
    };
    EndInvokeDelegate<TResult> endDelegate = _ => func();
    WrappedAsyncResult<TResult> result = new WrappedAsyncResult<TResult>(beginDelegate, endDelegate, tag);
    result.Begin(callback, state, -1);
    return result;
}

где «Begin» - это:

public void Begin(AsyncCallback callback, object state, int timeout)
{
    bool completedSynchronously;
    this._originalCallback = callback;
    lock (this._beginDelegateLockObj)
    {
        this._innerAsyncResult = this._beginDelegate(new AsyncCallback(this.HandleAsynchronousCompletion), state);
        completedSynchronously = this._innerAsyncResult.CompletedSynchronously;
        if (!completedSynchronously && (timeout > -1))
        {
            this.CreateTimer(timeout);
        }
    }
    if (completedSynchronously && (callback != null))
    {
        callback(this);
    }
}

РЕДАКТИРОВАТЬ: придумали неуклюжий способ заставить действия контроллера MVC «тайм-аут», хотя механизм немного грубоват:

public class TimeoutController : Controller
{
    private bool _isExecuting = false;
    private int _controllerTimeout = 5000;
    private Thread _executingThread;
    private readonly object _syncRoot = new object();

    protected override void ExecuteCore()
    {
        _executingThread = Thread.CurrentThread;
        ThreadPool.QueueUserWorkItem(o =>
            {
                Thread.Sleep(_controllerTimeout);
                if (_isExecuting)
                {
                    _executingThread.Abort();
                }
            });
        base.ExecuteCore();
    }

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        _isExecuting = true;
        base.OnActionExecuting(filterContext);
    }

    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        _isExecuting = false;                
        base.OnActionExecuted(filterContext);
    }

    public int ControllerTimeout
    {
        get
        {
            int retVal;
            lock(_syncRoot)
            {
                retVal = _controllerTimeout;
            }
            return retVal;
        }
        set
        {
            lock(_syncRoot)
            {
                _controllerTimeout = value;                    
            }
        }
    }
}
9
ответ дан JerKimball 1 September 2011 в 04:09
поделиться

Должно работать, когда выполняются следующие условия:

1) Доменное имя не является localhost (для проверки тайм-аута вы должны использовать «YourComputerName» вместо «localhost»).

2) Проект компилируется в режиме Release.

3) compilation debug = "false"

, если не ищите здесь альтернативу (ScriptTimeOut): ASP.NET MVC и httpRuntime executeTimeout

Приветствия,
Папа

2
ответ дан Community 1 September 2011 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: