2011-09-07 165 views
1

我在使用侏罗纪JavaScript编译器在我的C#应用​​程序中运行javascript。现在,侏罗系不是线程安全的,我从各处的线程调用函数(用JavaScript),我认为这不是那么聪明。我能做的只是为了在javscript-engine上创建一个简单的锁,然而,我想要的是一种类似于在WPF或WinForms中使用GUI线程时所使用的编程模型。所以,我产生了一个线程,并在该线程内创建了我的JavaScript引擎,我想要的是不允许其他线程编辑在该线程中创建的对象(这将只是JavaScript引擎和所有js -objectes)。然后,从其他线程调用js代码,我想使用调度程序或类似的东西,以使js线程运行代码。在控制台应用程序中调度C#线程

这是可能的C#?

回答

0

我不太清楚你在问什么,但我会尽力帮忙。

你可以使用信号量来锁定运行javascript引擎的线程吗?即使不使用Semaphore类,也可以使用布尔或“锁定”关键字来保护执行引擎的代码块。该线程产生的对象可以被引擎的类隐藏,直到你准备好了。您也可以在该类中公开一个方法,该方法允许从受保护代码的后面进行代码注入或对象提取。

+0

是的,好吧,这或多或少是我所做的。除了它会破坏我的程序,如果我不允许暴露对象(我需要在js中基本禁用eval)。我真正想要的是线程获取对象所有权的某种方式,比如在GUI编程中发生的事情,如果我尝试从后台线程更新属性,它会抛出异常。但我想这是内置于GUI组件本身: - /。 – Alxandr

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在文章中不适合您的需求,我想,你很可能创建一个由握住Thread.CurrentThread.ManagedThreadId当对象是模仿DispatcherObject的机制创建并针对每个暴露访问的值执行检查。除此之外或者其他等价物,我不认为有一种内置的机制将随机对象与给定的线程关联起来。

+0

非常好的答案。不幸的是,这意味着我不得不重写所有内容(或多或少),并且这是别人的代码,所以我不能完成任务,而是使用隐藏对象和锁实现更简单的方法不安全,但足够安全)。谢谢,但好的答案:) – Alxandr