2016-05-14 12 views
0

我有下面的代碼,當該方法沒有參數,但當我傳遞參數時不工作。我最初認爲當IIS中的上下文丟失時參數丟失了,所以我做了同樣事情的深層副本。我試圖記錄錯誤或消息,但同樣的事情 - 它從來沒有調用方法來完成任務。初始日誌消息寫入成功,但不是我想添加此方法的日誌消息發生在asp mvc項目中。我已經在這2天了,所有的stackoverflow和谷歌沒有解決方案。我添加了線程sleep讓後臺線程可能啓動,但它不起作用。 currentcontroller繼承自basecontroller類。記錄器使用log4net。日誌工作,我看到數據庫中的條目。 thread.sleep被添加來查看它是否通過使父線程等待後臺線程啓動來解決問題。有任何想法嗎?Task.Run參數不在ASP MVC中工作,但沒有參數傳遞

public class MainController : BaseController 
{ 
    [HttpPost] 
    public JsonResult ProcessSynchronization(int sourceId, string[] cities) 
    { 
     var ret = false; 
     try 
     {    

      if (sourceId == 1) 
      { 
       var cityDeep = (string[])cities.Clone(); 
       Logger.Info("ABout to start BeginSynchronization .."); 

       Task.Factory.StartNew(() => 
       { 
        Logger.Info("ABout to start BeginSynchronization enter.."); 

        BeginSynchronization(cityDeep); 
       }); 


       Thread.Sleep(5000); 
       ret = true; 
      } 

     } 
     catch (Exception ex) 
     { 
      Logger.Error(LogUtility.BuildExceptionMessage(ex), ex); 
      return Json(new { result = ret, responseText = "Customer could not be activated." }); 
     } 
     return Json(new { result = ret, responseText = "Synchronization started." }); 
    } 

    private void BeginSynchronization (string[] cities) 
    { 
     Logger.Info("BeginSynchronization entry processing.."); 

    } 
} 

public class BaseController : Controller 
{ 
    /// <summary> 
    /// Get logger 
    /// </summary> 
    protected ILog Logger 
    { 
     get { return LogManager.GetLogger(GetType()); } 
    } 
} 
+0

什麼'Thread.Sleep'的目的是什麼? Logger如何被聲明?你爲什麼要調用另一個線程內的實例方法(用'Task.Factory.StartNew'創建)?目前還不清楚你試圖達到什麼目的。另外,請添加整個控制器代碼並仔細檢查是否引發任何異常。 –

+0

我已添加更多詳情。調用一個實例方法是什麼意思?這是同一個控制器類中的私有方法。 –

回答

1

嘗試修改與async/await關鍵字,你的方法。

public async JsonResult ProcessSynchronization(int sourceId, string[] cities) 
{ 
    var ret = false; 
    try 
    {    

     if (sourceId == 1) 
     { 
      var cityDeep = (string[])cities.Clone(); 
      Logger.Info("ABout to start BeginSynchronization .."); 

      await Task.Factory.StartNew(() => 
      { 
       Logger.Info("ABout to start BeginSynchronization enter.."); 

       BeginSynchronization(cityDeep); 
      }); 


      ret = true; 
     } 

    } 
    catch (Exception ex) 
    { 
     Logger.Error(LogUtility.BuildExceptionMessage(ex), ex); 
     return Json(new { result = ret, responseText = "Customer could not be activated." }); 
    } 
    return Json(new { result = ret, responseText = "Synchronization started." }); 
} 

沒有async/await

public JsonResult ProcessSynchronization(int sourceId, string[] cities) 
{ 
    var ret = false; 
    try 
    {    

     if (sourceId == 1) 
     { 
      var cityDeep = (string[])cities.Clone(); 
      Logger.Info("ABout to start BeginSynchronization .."); 

      var thread = new Thread(() => 
      { 
       Logger.Info("ABout to start BeginSynchronization enter.."); 

       BeginSynchronization(cityDeep); 
      }); 
      thread.Start(); 


      ret = true; 
     } 

    } 
    catch (Exception ex) 
    { 
     Logger.Error(LogUtility.BuildExceptionMessage(ex), ex); 
     return Json(new { result = ret, responseText = "Customer could not be activated." }); 
    } 
    return Json(new { result = ret, responseText = "Synchronization started." }); 
} 
+0

我不希望控制器等待任務完成。我希望它是火和忘記,會不會等待呢? –

+1

不要再使用'Task.Factory.StartNew'。使用'Task.Run'。 – Tdorno

+0

我已經嘗試使用task.run,仍然無法正常工作。 –