我正在使用Jurassic javascript编译器在我的C#应用程序中运行javascript。现在,jurassic不是线程安全的,我从整个地方的线程调用函数(在javascript中),我认为这不是那么聪明。我能做的只是在javscript引擎上创建一个简单的锁,但是,我想要的是一个类似于在WPF或WinForms中使用GUI线程时的编程模型。所以,我生成了一个线程,并在该线程中创建了我的javascript引擎,我想要的是没有其他线程可以编辑在该线程中创建的对象(这将只是javascript引擎和所有js -objectes)。然后,要从其他线程调用js-code,我想使用调度程序或类似的东西来使js-thread运行代码。
这在C#中是否可行?
答案 0 :(得分:2)
它没有完全回答你的问题,但是你可能想看看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;
}
}
}
调用将使用内置的Dispatcher。
ThreadOwnedObject ownedInstance = new ThreadOwnedObject();
ownedInstance.Dispatcher.Invoke(new Action(() => ownedInstance.ExposedProperty = "foo"));
或者,如果文章中的DispatcherSynchronizationContext或者DispatcherSynchronizationContext不符合您的需求,我想您可以通过在创建对象时保留Thread.CurrentThread.ManagedThreadId并执行检查来创建一个模仿DispatcherObject的机制。针对每个公开访问的值。除此之外,我不认为有一个内置机制会将随机对象与给定线程相关联。
答案 1 :(得分:0)
我不太确定你在问什么,但无论如何我都会尽力帮助。
你能用信号量来锁定运行javascript引擎的线程吗?即使您不使用Semaphore类,也可以使用布尔值或“lock”关键字来保护执行引擎的代码块。该线程生成的对象可以由类与引擎一起隐藏,直到您准备好。您还可以在该类中公开一个方法,该方法允许从受保护代码后面进行代码注入或对象提取。