【问题标题】:Thread.Sleep only works with breakpoint? [closed]Thread.Sleep 仅适用于断点? [关闭]
【发布时间】:2014-09-16 12:38:32
【问题描述】:

我有一个 lua 脚本,它调用名为“delay”的方法,该方法调用以下内容:

public void Delay(int millisecondsTimeout)
{
     Thread.Sleep(millisecondsTimeout);
}

但是,当 lua 脚本调用它时,它似乎忽略了这行代码,只运行其余代码而不阻塞线程(脚本在不同的线程上运行)。

但是,当我在 Thread.Sleep 行上放置断点时,它会按预期工作。

为什么会这样?太奇怪了!

编辑:这就是我创建脚本线程的方式:

new Thread(() =>
                {
                    this.Script.DoFile(this.Path);
                }).Start();

我使用lua.RegisterFunction注册方法,调用就好了。

【问题讨论】:

  • 你刚才说脚本在不同的线程上运行。那你为什么认为Thread.Sleep()会对它产生影响呢?
  • @JeroenVannevel 它阻塞了当前线程,也就是调用它的线程(脚本线程),那它为什么不“停止”脚本执行呢?
  • @JeroenVannevel - 与问题不同。如果脚本只是简单地调用它,那么这是一个有效的问题。
  • 你能给我们代码吗?
  • 我认为提供帮助的一个好方法是创建一个新的新项目并复制产生奇怪问题的一段代码......尽量让它变得简单。我的意思是,让它变成 10 或 20 行。如果问题仍然存在,请为我们复制它们。 (但通常是简化过程,说明问题的原因)

标签: c# multithreading lua


【解决方案1】:

但是,当 lua 脚本调用它时,它似乎忽略了这行代码,只运行其余代码而不阻塞线程(脚本在不同的线程上运行)。

如果脚本在不同的线程上运行,您应该在该线程上调用 sleep。如果调用 Thread.Sleep,它会休眠当前正在执行的线程。例如:

线程 A -> 启动线程 B - 如果你在线程 A 中调用 Thread.Sleep,将休眠线程 A,而不是线程 B。

由于您的线程代码中没有循环,因此不可能在线程 B 中调用 Thread.Sleep。

一个可能的解决方案是从主线程挂起后台线程。

myBackgroundThread = new Thread(() => //myBackgroundThread is a private variable.
            {
                this.Script.DoFile(this.Path);
            }).Start();

从主线程::

myBackgroundThread.Suspend();
Thread.Sleep(ms);
myBackgroundThread.Resume()

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多