【发布时间】: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