Как я могу сделать 2 запроса одновременно на сервер (asp.net MVC 3) - PullRequest
1 голос
/ 16 февраля 2012

Я действительно не знаю, как мне поступить, чтобы иметь возможность опрашивать информацию с помощью jscript и продолжать вызывать другой скрипт, который будет вызывать метод на стороне сервера.

Я хочу сделать что-то в течение 42 секунд, а затем, если это займет слишком много времени, убить процесс, в противном случае вернуть новые данные json.

Но проблема в том, что когда я хочу вызвать новый метод, пока он работает, он не позволит мне, потому что его простой поток. Я пытался с асинхронным контроллером, но я не уверен, что я делаю это нормально, вот часть кода:

Контроллер

    public class CadController : AsyncController

{

    /// <summary>
    /// Use to set the view and set the model in memory
    /// </summary>
    /// <param name="RessourceNo">The ressource number</param>
    /// <returns>The new view</returns>
    public ActionResult Index()
    {
        var _model = new PollModels();
        HttpRuntime.Cache["PollModels"] = _model;
        return View(_model);
    }

    [OutputCache(Duration = 0)]
    /// <summary>
    /// Use to change the data of the model
    /// </summary>
    /// <returns>The new html code</returns>
    public void CadDataAsync()
    {
        AsyncManager.OutstandingOperations.Increment();

        CadDataService _service = new CadDataService();
        _service.GetPollModelsCompleted += (sender, e) =>
         {
             AsyncManager.Parameters["pollModels"] = e.getValue();
             AsyncManager.OutstandingOperations.Decrement();
         };
        _service.GetPollModelsAsync();
    }

    public JsonResult CadDataCompleted(PollModels pollModels)
    {
        return Json(pollModels, JsonRequestBehavior.AllowGet);
    }


    #region [Partial View]

    /// <summary>
    /// Use to set nothing for a div
    /// useful if you want to hide something when you change page
    /// </summary>
    /// <param name="Model">A CadModels Model</param>
    /// <returns>An empty result</returns>
    public ActionResult Blank()
    {
        return new EmptyResult();
    }
    #endregion

    /// <summary>
    /// Use to send the new status to the database
    /// </summary>
    /// <param name="Status">The new status</param>
    /// <param name="Model">The buttons models</param> 
    /// <returns>a empty view</returns>
    public ActionResult PushButton(string description, string code)
    {
        var _manager = new GeneralManager();
        GeneralModels _generalModel = _manager.GetGeneralModels();

        AppEnt.Cad.CadResource _ress = AppBus.Cad.CadResource.GetCadResourceFromName(_generalModel.RessourceNo);
        _ress.ResourceStatusDesc = description;
        _ress.ResourceStatusCode = code;
        ServerV5.GetInstance().Update(_ress);
        return new EmptyResult();
    }

CadDataService

    public class CadDataService
{

    int getSleep() { return (int)SH.eServiceTime.eCadData; }
    void DoSleep() { Thread.Sleep(getSleep()); }

    public PollModels GetPollModels()
    {
        DoSleep();
        var manager = new LongPollingManager();
        return manager.GetPollModels();
    }

    public event EventHandler<PollModelEventArgs> GetPollModelsCompleted;


    public void GetPollModelsAsync()
    {
        SynchronizationContext syncContext = SynchronizationContext.Current;

        Timer timer = new Timer(state =>
            syncContext.Send(d => OnGetPollModelsCompleted(new PollModelEventArgs()), state),
            null, 10000, Timeout.Infinite);
        HttpContext.Current.Items[this] = timer; // don't let the GC kill the timer
    }

    private void OnGetPollModelsCompleted(PollModelEventArgs e)
    {
        EventHandler<PollModelEventArgs> handler = GetPollModelsCompleted;
        if (handler != null)
        {
            handler(this, e);
        }
    }

}

}

И, наконец, EventArgs

    public class PollModelEventArgs : EventArgs
{
    public PollModels Value;
    public PollModelEventArgs()
    {

    }

    public PollModels getValue()
    {
        var _manager = new LongPollingManager();
        Value = _manager.GetPollModels();
        return Value;
    }


}

public static class SH
{
    public enum eServiceTime { eCadData = 700, };
}
...