1

我正在创建与不同数据库交互的多个线程。假设我想暂停该特定线程并恢复同一个线程而不影响数据库操作,我该怎么做。

我的代码如下所示

 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";

            }
        }

我怎样才能安全地暂停和恢复我的线程..?

提前致谢

4

1 回答 1

0

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

  • 保证数据结构处于一致状态
  • 并且线程处于无阻塞状态

它们都非常明显。第一个意味着您不想在线程正在写入数据结构的过程中暂停线程,这可能会使它处于不一致的状态。第二个意味着您不想让线程处于可能导致另一个线程阻塞的状态。用更简单的术语来说,这意味着您不想在线程持有锁时暂停线程。

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

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.
      }
    }
  }
}
于 2013-11-06T16:20:38.670 回答