Ошибка в асинхронной обработке C # - PullRequest
0 голосов
/ 20 февраля 2012

Веб-приложений на основе. NET MVC 3 для установки ошибки асинхронного рабочего значения C #, код следующий:

public ActionResult Contact ()
            {
                    / / Create an asynchronous processing operations
                    Task task = new Task (() => {
                            string [] testTexts = new string [10] {"a", "b", "c", "d", "e", "f", "g", "h" , "i", "j"};
                            foreach (string text in testTexts)
                            {
                                    / / The following line does not have a problem
                                    System.IO.File.AppendAllText (Server.MapPath ("/ test.txt"), text);
                                    / / The following line to be a problem, find a solution. Because some other program of practical application in my project set to use System.Web.HttpContext.Current
                                    / / System.IO.File.AppendAllText (System.Web.HttpContext.Current.Server.MapPath ("/ test.txt"), text);
                                    / / Thread to hang five seconds to simulate asynchronous time difference
                                    System.Threading.Thread.Sleep (5000);
                            }
                    });
                    / / Asynchronous processing
                    task.Start ();
                    return View ();
            }

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Поскольку HttpContext привязан к текущему запросу, после его возврата он больше не будет доступен. Но ваша асинхронная задача продолжает выполняться в фоновом режиме, и когда она пытается получить к ней доступ, она больше не доступна. По этой причине вы должны передать все зависимости задаче в качестве параметра:

public ActionResult Contact()
{
    // everything that depends on an HttpContext should be done here and passed
    // as argument to the task
    string p = HttpContext.Server.MapPath("~/test.txt");

    // Create an asynchronous processing operations
    Task task = new Task(state =>
    {
        var path = (string)state;
        var testTexts = new[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" };
        foreach (string text in testTexts)
        {
            System.IO.File.AppendAllText(path, text);

            // Thread to hang five seconds to simulate asynchronous time difference
            Thread.Sleep(5000);
        }
    }, p);

    // Asynchronous processing
    task.Start();
    return View();
}
0 голосов
/ 20 февраля 2012

Ваш код обязательно завершится с ошибкой, так как ваш запрос по-прежнему обрабатывается синхронно и не ожидает завершения асинхронного потомства. HttpRequest.Current, как следует из названия, связан с текущим запросом. И все же с оператором return View (); вы в основном указываете asp.net выполнить все свои действия и завершить запрос как можно скорее, тем самым делая HttpRequest.Current недействительным, поскольку запрос завершен / завершен / закрыт.

Вы должны либо дождаться завершения асинхронной задачи, либо не полагаться на HttpContext.Current в вашей асинхронной задаче.

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