按需执行中断方法

时间:2018-07-12 00:53:30

标签: c# multithreading methods task

我确实有一种方法,在一个任务中运行该方法的执行时间可能需要一段时间(大约2分钟):

public Task BaseWorkerTask { get; set; }

public void Initialize()
{
    BaseWorkerTask = Task.Run(() => 
    {
        BaseWorker();
    });
}

public void BaseWorker()
{
    Server.Speak(Packet.Greeting);

    while (WaitServerResponse())
    {
        DoSomethingElse();
    }

    var response = Server.GetResponse();

    if (response.Equals("abc"))
    {
        DoAbcTask();
    }
    else if (response.Equals("def"))
    {
        [...]
    }

    [...]
}

我希望能够在给定的时间段内中断其执行,以便进行其他一些服务器调用。这里要注意的重要一点是,我希望它在BaseWorker方法的当前行“暂停”脚本的执行,就在它的确切位置。

类似的东西:

if (!BaseWorkerTask.IsCompleted)
{
    // Pause to do something else
    // BaseWorkerTask.StopAtCurrentPlace();

    DoSomethingElse();

    // Once something else is done, resume BaseWorkerTask
    // BaseWorkerTask.Resume();
}

可以实现这种方法吗?

我一直在尝试阻塞线程,但是一旦方法在System.Threading.Thread.Sleep(...)中使用了无限循环后,我就只能阻塞它。

2 个答案:

答案 0 :(得分:1)

Thread.Suspend可能是您最接近的,但是它被 标记为过时 ,并带有以下(相关)警告:

  

请勿使用Suspend和Resume方法来同步线程的活动。您无法知道挂起线程时正在执行什么代码。如果在安全权限评估期间暂停线程持有锁的线程,则AppDomain中的其他线程可能会被阻止。如果在执行类构造函数时挂起线程,则AppDomain中尝试使用该类的其他线程将被阻止。死锁很容易发生。

简而言之,由于与上述完全相同的原因,任何可以做到这一点的方法都是一个坏主意。

尝试在线程池线程上使用它实际上可以确保您出现故障。

如果要执行此操作,则必须考虑一种可以在任务暂停中进行协作的方式。可能会涉及到在代码中添加同步内容。

反正花了这么长时间?

答案 1 :(得分:0)

我将使用某种bool标志,类似于取消令牌。当您要暂停执行任务时,将其设置为true,并在BaseWorker内部检查变量的值。如果是true,请使用Thread.Sleep暂停执行,直到将其设置为false

示例:

bool suspendExecution = false;

public void Initialize()
{
    BaseWorkerTask = Task.Run(() =>
    {
        BaseWorker(ref suspendExecution);
    });
}



public void BaseWorker(ref bool suspend)
{
    while (WaitServerResponse())
    {
         if (suspend)
         {
             while (suspend)
             {
                 Thread.Sleep(1000);
             }
         }

         DoSomethingElse();
     }
}