根据参数跳过线程,然后稍后返回

时间:2017-05-15 04:22:59

标签: multithreading asynchronous synchronization locking semaphore

我有一个接受值的方法,如果满足条件,则该动作不应该运行24小时。但是当它停止时,我想运行其他没有遇到这种情况的线程。

在这个例子中,我在程序开头有30个线程。一旦我制作了5块奶酪,我就需要停下来,因为奶酪太多了。如果有一个地方可以发送无法执行的线程直到时间用完而其他线程正在运行,那将会是多么美妙的事情。即使使用Wait,Task.Delay似乎也没有效果。

这是我的代码示例:

//Stop making cheese when you have enough for the day but continue making others
  public void madeEnoughToday(string cheese)
    {
//Find how much cheese is made based on cheese type.
            DataGridViewRow row = cheeseGV.Rows
                .Cast<DataGridViewRow>()
                .Where(r => 
r.Cells["Cheese"].Value.ToString().Equals(cheese))
                .First();
            if (row.Cells["MadeToday"].Value.Equals(row.Cells["Perday"].Value))
            {
                Task.Delay(30000).Wait();
            }
    }

1 个答案:

答案 0 :(得分:0)

当我需要暂停线程执行时,我使用另一个线程(全局变量或其他实现) - 为线程的第二个实例调用Thread.Join()方法。

Thread tPause; // global var

private void MyThreadFunc()
{
    // do something
    if (pauseCondition)
    {
        tPause=new Thread(PauseThread);
        tPause.Start();
        tPause.Join(); // You can specify needed milliseconds, or TimeSpan
        // the subsequent code will not be executed until tPause.IsAlive == true
        // IMPORTANT: if tPause == null during Join() - an exception occurs
    }
}
private void PauseThread()
{
    Thread.Sleep(Timeout.Infinite); // You can specify needed milliseconds, or TimeSpan
}

private void Main()
{
    // any actions  
    Thread myThread=new Thread(MyThreadFunc);
    myThread.Start();
    // any actions

}

这种实现有很多种方法。 如果要继续执行线程,可以为暂停线程实例调用Thread.Abort()方法,或者对暂停线程使用复杂的函数结构。