2012-02-20 2 views
0

WEB-приложения на основе. NET MVC 3 установить C# асинхронных рабочее значение ошибки, код следующим образом:Ошибка операции асинхронной обработки 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(); 
      } 
+0

System.Web.HttpContext.Current, почему вы используете эту строку, что вы хотите точно –

ответ

1

Поскольку 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

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

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

Смежные вопросы