2015-10-16 235 views
-2

我的代碼是:停止線程

if (save) 
      { 
       request.DataMessage = base.SaveChanges(); 
       if (request.DataMessage.IsSuccess) 
       { 
        request.CustomID = arRequest.CustomID;       
        Task.Run(() => TaskWriteARAddLog(request, arTimestamp, arRequest, _tModel)); 

       } 
      } 

單,當用戶工作在我的應用程序,比我還沒有得到任何的問題,但是當多個用戶的工作比我得到這個問題: 「新事務不被允許,因爲會話中還有其他線程在運行。」

+2

這似乎是來自EF/SQL,您應該發佈TaskWriteARAddLog正文。也許你沒有處置什麼東西。 – Robert

+0

是的,它來自EF ,,所以請告訴我解決方案, –

+1

你是[使用task.Run()的錯誤目的](http://blog.stephencleary.com/2013/10/taskrun-etiquette-和適當-usage.html中)。對於一個建議,我們需要看到周圍的代碼。 –

回答

0

您可以使用lock語句創建關鍵部分,以便一次一個線程執行代碼塊。

lock(_lockingObject) 
{ 
       request.DataMessage = base.SaveChanges(); 
       if (request.DataMessage.IsSuccess) 
       { 
        request.CustomID = arRequest.CustomID;       
        Task.Run(() => TaskWriteARAddLog(request, arTimestamp, arRequest, _tModel)); 

       } 

} 

//where _lockingObject is a field on your class: 

object _lockingObject =new object(); 

Here is a link您可以從中瞭解鎖定語句的工作方式。

如果您必須使用Task.Run(),代碼應該等到任務完成。

var task = Task.Run(...); 
task.Wait(); 

// or 
Task.Run(...).Wait(); 

希望這有助於。

+0

它會正常工作,當我在這裏使用等待方法,但我不想用等待,因爲Task.Run()創建歷史記錄,它需要20秒。我不想停止我的前端持續20秒。這個過程將在後臺運行,但不會等待,我得到這個錯誤:「事務操作無法執行,因爲有這個事務處理掛起的請求。」在我的錯誤日誌表中,所以告訴我如何解決它 –