C#线程调度在控制台应用程序中

时间:2011-09-07 00:24:17

标签: c# multithreading

我正在使用Jurassic javascript编译器在我的C#应用​​程序中运行javascript。现在,jurassic不是线程安全的,我从整个地方的线程调用函数(在javascript中),我认为这不是那么聪明。我能做的只是在javscript引擎上创建一个简单的锁,但是,我想要的是一个类似于在WPF或WinForms中使用GUI线程时的编程模型。所以,我生成了一个线程,并在该线程中创建了我的javascript引擎,我想要的是没有其他线程可以编辑在该线程中创建的对象(这将只是javascript引擎和所有js -objectes)。然后,要从其他线程调用js-code,我想使用调度程序或类似的东西来使js-thread运行代码。

这在C#中是否可行?

2 个答案:

答案 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”关键字来保护执行引擎的代码块。该线程生成的对象可以由类与引擎一起隐藏,直到您准备好。您还可以在该类中公开一个方法,该方法允许从受保护代码后面进行代码注入或对象提取。