【问题标题】:Interrupt method execution on demand按需中断方法执行
【发布时间】:2018-07-12 00:53:29
【问题描述】:

我确实有一个方法,它的执行时间可能需要一段时间(大约 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(...) 的无限循环后,我才能阻塞它。

【问题讨论】:

标签: c# multithreading methods task


【解决方案1】:

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

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

简而言之,出于与上述完全相同的原因,任何可以做到这一点的东西都不是一个好主意。

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

如果你想这样做,你必须想办法让任务在自己的暂停中进行协作。很可能,这将涉及在代码中添加同步内容。

到底是怎么回事?

【讨论】:

  • 谢谢。 What's taking so long anyway? 嗯,我做了很多数据包测试,另外还有 http 请求,所有这些。
【解决方案2】:

我会使用某种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();
     }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-16
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多