2011-09-07 144 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