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

本文关键字:应用程序 控制台 线程调度 | 更新日期: 2023-09-27 18:07:53

我只是使用侏罗纪javascript编译器在我的c#应用程序中运行javascript。现在,侏罗纪不是线程安全的,我从各处的线程调用函数(在javascript中),我认为这不是那么聪明。我能做的当然只是在javascript引擎上创建一个简单的锁,然而,我想要的是一个类似于在WPF或WinForms中使用GUI线程时所拥有的编程模型。因此,我创建了一个线程,并在该线程中创建了我的javascript-引擎,我想要的是不允许其他线程编辑该线程中创建的对象(这将只是javascript-引擎和所有js-对象)。然后,要从其他线程调用js代码,我想使用分派器,或类似的东西,使js线程运行代码。

这在c#中可能吗?

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

这并没有完全回答你的问题,但你可能想看看这篇MSDN文章。它讨论了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,并针对每个公开的访问执行该值检查。除此之外,我不认为有一个内置的机制,将随机对象与给定的线程相关联。

我不太清楚你在问什么,但我还是会尽力帮助你的。

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