我对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对象也分配给角色对象。 Character类具有以下内容:
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。如果主线程将设置Script对象的响应,那不会给我一个例外(因为我从主线程访问它)?
2. 如果脚本线程访问分配给它的字符对象,并且主线程也访问它,会发生什么?不会碰撞吗?
感谢。
答案 0 :(得分:0)
正如@ByteBlast所说,由于您不使用UI(表单,控件等),因此不存在异常风险。但是,@ sasha_gud说他应该实现同步以避免问题是正确的,因为你有两个线程访问同一个对象。这里最简单的方法是使用Lock
。