数据库操作期间安全线程暂停和恢复

时间:2013-11-06 12:44:38

标签: c# multithreading synchronization

我正在创建多个与不同数据库交互的线程。假设我想暂停该特定线程并恢复相同的线程而不影响数据库操作我将如何这样做。

我的代码如下所示

 thread begin
 for(;;)
 {
 //do something 
 //Critical section begins
 Database Operation like update or insert usually takes long time
 //Critical section ends
 //do something
 thread.sleep(10000);
 }

我必须确保每当我暂停线程时,它必须等到关键部分操作完成。所以恢复可以更容易。

我正在使用以下代码暂停,但在进行数据库操作时会抛出异常。

        while (tA1.IsAlive)
        {

            if (tA1.ThreadState == ThreadState.WaitSleepJoin)
            {

                tA1.Suspend();
                Status1A.Text = "Upload Paused";

            }
        }

我如何安全地暂停和恢复我的线程.. ??

先谢谢

1 个答案:

答案 0 :(得分:0)

要安全地执行此操作,您需要使线程在安全点进入WaitSleepJoin状态。安全点被定义为执行顺序中的一个位置:

  • 保证数据结构处于一致状态
  • 线程处于无障碍状态

他们真的很明显。第一个意味着您不希望在写入数据结构的过程中暂停线程,这可能会使其处于不一致状态。第二个意味着您不希望将线程置于可能导致另一个线程阻塞的状态。简单来说,这意味着您不想在持有锁定时暂停线程。

有很多方法可以做到这一点,但使用ManualResetEventSlim可能是最简单的方法。

public class Example
{
  private ManualResetEventSlim allow = new ManualResetEventSlim();

  public void Start()
  {
    Task.Factory.StartNew(WorkerThread, TaskCreationOptions.LongRunning); 
  }

  public void Pause()
  {
    allow.Reset();
  }

  public void Resume()
  {
    allow.Set();
  }

  private void WorkerThread()
  {
    while (true)
    {
      allow.Wait(); // Wait at a safe point.
      lock (...)
      {
        // Your database operation goes here.
      }
    }
  }
}