2015-10-16 2 views
-2

моего кода:остановка нить, когда задача была выполнена в C#

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(_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

будет работать нормально, когда я буду использовать метод wait здесь, но я не хочу использовать wait, потому что Task.Run() создает историю, она занимает 20 секунд. И я не хочу останавливать свой интерфейс в течение 20 секунд. Этот процесс будет работать в фоновом режиме. Но без ожидания я получаю эту ошибку: «Операция транзакции не может быть выполнена, потому что есть ожидающие запросы на эту транзакцию». в моей таблице журнала ошибок, так что скажите мне, как я могу это исправить –

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