Skip to main content
Stack Overflow на русском

Вернуться к ответу

в текст добавлено 166 символов
Источник Ссылка
aepot
  • 54.3k
  • 6
  • 28
  • 67

Можно использовать асинхронную блокировку вместо lock, а также запускать синхронные методы в отдельном потоке.

private SemaphoreSlim semaphore = new SemaphoreSlim(1);
async Task MyMethod(MyDBContext context)
{
 await semaphore.WaitAsync();
 try
 {
 using transaction = await context.Database.BeginTransactionAsync(); 
 await Task.Run(() =>
 {
 UpdateTb1(context);
 UpdateTb2(context);
 UpdateTb3(context);
 transaction.Commit();
 });
 }
 finally
 {
 semaphore.Release();
 }
}

В это случае основной поток не будет заблокирован, пока идет ожидание и выполнение транзакции, и другие пользователи смогут пользоваться сервисом.

Как я понимаю, вы не могли использовать асинхронные методы из-за lock, теперь вы сможете это исправить и избавиться от Task.Run(), который я предложил.

Кстати, обратите внимание, что SemaphoreSlim реализует IDisposable, для аккуратного его применения позаботьтесь о том, чтобы вызвать ему Dispose(), когда он станет не нужен.

Можно использовать асинхронную блокировку вместо lock, а также запускать синхронные методы в отдельном потоке.

private SemaphoreSlim semaphore = new SemaphoreSlim(1);
async Task MyMethod(MyDBContext context)
{
 await semaphore.WaitAsync();
 try
 {
 using transaction = await context.Database.BeginTransactionAsync(); 
 await Task.Run(() =>
 {
 UpdateTb1(context);
 UpdateTb2(context);
 UpdateTb3(context);
 transaction.Commit();
 });
 }
 finally
 {
 semaphore.Release();
 }
}

В это случае основной поток не будет заблокирован, пока идет ожидание и выполнение транзакции, и другие пользователи смогут пользоваться сервисом.

Как я понимаю, вы не могли использовать асинхронные методы из-за lock, теперь вы сможете это исправить и избавиться от Task.Run(), который я предложил.

Можно использовать асинхронную блокировку вместо lock, а также запускать синхронные методы в отдельном потоке.

private SemaphoreSlim semaphore = new SemaphoreSlim(1);
async Task MyMethod(MyDBContext context)
{
 await semaphore.WaitAsync();
 try
 {
 using transaction = await context.Database.BeginTransactionAsync(); 
 await Task.Run(() =>
 {
 UpdateTb1(context);
 UpdateTb2(context);
 UpdateTb3(context);
 transaction.Commit();
 });
 }
 finally
 {
 semaphore.Release();
 }
}

В это случае основной поток не будет заблокирован, пока идет ожидание и выполнение транзакции, и другие пользователи смогут пользоваться сервисом.

Как я понимаю, вы не могли использовать асинхронные методы из-за lock, теперь вы сможете это исправить и избавиться от Task.Run(), который я предложил.

Кстати, обратите внимание, что SemaphoreSlim реализует IDisposable, для аккуратного его применения позаботьтесь о том, чтобы вызвать ему Dispose(), когда он станет не нужен.

в текст добавлено 159 символов
Источник Ссылка
aepot
  • 54.3k
  • 6
  • 28
  • 67

Можно использовать асинхронную блокировку вместо lock, а также запускать синхронные методы в отдельном потоке.

private SemaphoreSlim semaphore = new SemaphoreSlim(1);
async Task MyMethod(MyDBContext context)
{
 await semaphore.WaitAsync();
 try
 {
 using transaction = await context.Database.BeginTransactionAsync(); 
 await Task.Run(() =>
 {
 UpdateTb1(context);
 UpdateTb2(context);
 UpdateTb3(context);
 transaction.Commit();
 });
 }
 finally
 {
 semaphore.Release();
 }
}

В это случае основной поток не будет заблокирован, пока идет ожидание и выполнение транзакции, и другие пользователи смогут пользоваться сервисом.

Как я понимаю, вы не могли использовать асинхронные методы из-за lock, теперь вы сможете это исправить и избавиться от Task.Run(), который я предложил.

Можно использовать асинхронную блокировку вместо lock, а также запускать синхронные методы в отдельном потоке.

private SemaphoreSlim semaphore = new SemaphoreSlim(1);
async Task MyMethod(MyDBContext context)
{
 await semaphore.WaitAsync();
 try
 {
 using transaction = await context.Database.BeginTransactionAsync(); 
 await Task.Run(() =>
 {
 UpdateTb1(context);
 UpdateTb2(context);
 UpdateTb3(context);
 transaction.Commit();
 });
 }
 finally
 {
 semaphore.Release();
 }
}

В это случае основной поток не будет заблокирован, пока идет ожидание и выполнение транзакции, и другие пользователи смогут пользоваться сервисом.

Можно использовать асинхронную блокировку вместо lock, а также запускать синхронные методы в отдельном потоке.

private SemaphoreSlim semaphore = new SemaphoreSlim(1);
async Task MyMethod(MyDBContext context)
{
 await semaphore.WaitAsync();
 try
 {
 using transaction = await context.Database.BeginTransactionAsync(); 
 await Task.Run(() =>
 {
 UpdateTb1(context);
 UpdateTb2(context);
 UpdateTb3(context);
 transaction.Commit();
 });
 }
 finally
 {
 semaphore.Release();
 }
}

В это случае основной поток не будет заблокирован, пока идет ожидание и выполнение транзакции, и другие пользователи смогут пользоваться сервисом.

Как я понимаю, вы не могли использовать асинхронные методы из-за lock, теперь вы сможете это исправить и избавиться от Task.Run(), который я предложил.

в текст добавлено 52 символа
Источник Ссылка
aepot
  • 54.3k
  • 6
  • 28
  • 67

Можно использовать асинхронную блокировку вместо lock, а также запускать синхронные методы в отдельном потоке.

private SemaphoreSlim semaphore = new SemaphoreSlim(1);
async Task MyMethod(MyDBContext context)
{
 await semaphore.WaitAsync();
 try
 {
 using transaction = await context.Database.BeginTransactionAsync(); 
 await Task.Run(() =>
 {
 UpdateTb1(context);
 UpdateTb2(context);
 UpdateTb3(context);
 transaction.Commit();
 });
 }
 finally
 {
 semaphore.Release();
 }
}

В это случае основной поток не будет заблокирован, пока идет ожидание и выполнение транзакции, и другие пользователи смогут пользоваться сервисом.

Можно использовать асинхронную блокировку вместо lock, а также запускать синхронные методы в отдельном потоке.

private SemaphoreSlim semaphore = new SemaphoreSlim(1);
async Task MyMethod(MyDBContext context)
{
 await semaphore.WaitAsync();
 try
 {
 using transaction = await context.Database.BeginTransactionAsync(); 
 await Task.Run(() =>
 {
 UpdateTb1(context);
 UpdateTb2(context);
 UpdateTb3(context);
 transaction.Commit();
 });
 }
 finally
 {
 semaphore.Release();
 }
}

В это случае основной поток не будет заблокирован, пока идет ожидание и выполнение транзакции.

Можно использовать асинхронную блокировку вместо lock, а также запускать синхронные методы в отдельном потоке.

private SemaphoreSlim semaphore = new SemaphoreSlim(1);
async Task MyMethod(MyDBContext context)
{
 await semaphore.WaitAsync();
 try
 {
 using transaction = await context.Database.BeginTransactionAsync(); 
 await Task.Run(() =>
 {
 UpdateTb1(context);
 UpdateTb2(context);
 UpdateTb3(context);
 transaction.Commit();
 });
 }
 finally
 {
 semaphore.Release();
 }
}

В это случае основной поток не будет заблокирован, пока идет ожидание и выполнение транзакции, и другие пользователи смогут пользоваться сервисом.

Источник Ссылка
aepot
  • 54.3k
  • 6
  • 28
  • 67
Загрузка
lang-cs

AltStyle によって変換されたページ (->オリジナル) /