2015-10-16 191 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秒。这个过程将在后台运行,但不会等待,我得到这个错误:“事务操作无法执行,因为有这个事务处理挂起的请求。”在我的错误日志表中,所以告诉我如何解决它 –