我正在使用Jurassic javascript编译器在我的C#应用程序中运行javascript。现在,侏罗纪不是线程安全的,我从到处都是的线程调用函数(在javascript中),我认为这并不是那么聪明。我所能做的就是在javscript引擎上创建一个简单的锁,然而,我想要的是一个类似于在WPF或WinForms中使用GUI线程的编程模型。因此,我产生了一个线程,并在该线程中创建了我的javascript-engine,我希望的是不允许任何其他线程编辑在该线程中创建的对象(这将只是javascript-engine和所有的js-objecte)。然后,为了从其他线程调用js-code,我想使用一个分派器或类似的东西,让js-thread运行代码。
这在C#中是可能的吗?
发布于 2011-09-07 09:46:32
我不太清楚你在问什么,但我会尽力帮助你的。
你能使用信号量来锁定运行javascript引擎的线程吗?即使您不使用Semaphore类,也可以使用boolean或"lock“关键字来保护执行引擎的代码块。由该线程产生的对象可以被带有引擎的类隐藏,直到您准备好为止。您还可以在该类中公开一个方法,该方法允许代码注入或从受保护代码后面获取对象。
发布于 2011-09-07 22:59:55
它没有完全回答你的问题,但你可能想看看this MSDN article.,它谈到了WPF对它们的对象和Dispatcher模型,以及Dispatcher,DispatcherObject和DispatcherSynchronizationContext类采取的方法。
对于单个对象,他们建议从DispatcherObject继承(对于您的情况可能不可行),并在公共访问上调用继承的VerifyAccess()方法。
public class ThreadOwnedObject : DispatcherObject
{
private string field;
public string ExposedProperty
{
get { return field; }
set
{
VerifyAccess();
field = value;
}
}
}并且调用将使用内置的调度程序。
ThreadOwnedObject ownedInstance = new ThreadOwnedObject();
ownedInstance.Dispatcher.Invoke(new Action(() => ownedInstance.ExposedProperty = "foo"));或者,如果这一点或本文中的DispatcherSynchronizationContext不能满足您的需要,我想您可以创建一种机制来模拟DispatcherObject,方法是在创建对象时保留Thread.CurrentThread.ManagedThreadId,并针对每个公开的访问执行对该值的检查。除此之外,我不认为有一种内置的机制可以将随机对象与给定的线程相关联。
https://stackoverflow.com/questions/7327630
复制相似问题