【问题标题】:Multi threading object access多线程对象访问
【发布时间】:2015-03-07 22:06:59
【问题描述】:

我有两个关于 C# 中的多线程的问题。

我的程序有脚本,我正在使用 LuaInterface 项目来加载和执行它们。我想在不同的线程上运行脚本,所以我做了以下操作:

new Thread(() =>
{
    using (Lua lua = new Lua())
    {   
        Script script = new Script(character, this.ID);

        lua.RegisterFunction("sendMessage", script, typeof(NpcScript)
            .GetMethod("SendMessage"));

        lua.LoadFile(@"Scripts\" + this.Script + ".lua").Call();
    }
}).Start();

所以这应该在不同的线程上运行脚本。 Script 对象也被分配给字符对象。字符类有以下内容:

public Script Script { get; set; }

脚本的类结构是这样的:

public class Script
{
    public Character Character { get; private set; }
    public int ID { get; private set; }
}

方法 sendMessage 使用 ManualResetEvent 返回一个布尔类型值。主程序线程设置值,然后sendMessage返回(sendMessage阻塞当前线程,直到主线程设置响应)。

但是,我面临两个困境。

1.如果主线程将设置脚本对象的响应,那不会给我一个异常(因为我是从主线程访问它)?

2. 如果脚本线程访问分配给它的角色对象,而主线程也访问它会怎样?不会碰撞吗?

谢谢。

【问题讨论】:

  • 1.不会。只有当您尝试从不“拥有”控件句柄的线程访问控件时,才会发生异常。您在这里没有使用 Windows 控件,因此无需担心。 2. 也许。如果没有明确解释脚本的性质/Character 类型,就很难说。
  • @ByteBlast 你需要知道什么?
  • 只是备注:您应该将脚本命名为“CharacterScript”。目前它的字符上下文是隐藏的,会误导人们认为你也可以将它用于 CarScript 或其他任何东西
  • 2.如果在 Script 类之外的任何地方都没有实现同步,那么您应该在 Script 或 Character 类中手动实现同步以避免冲突。

标签: c# multithreading


【解决方案1】:

正如@ByteBlast 所说,由于您不使用 UI(表单、控件等),因此没有出现异常的风险。但是,@sasha_gud 说你应该实现同步以避免问题是正确的,因为你有两个线程访问同一个对象。这里最简单的做法是使用Lock

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多