nsjsdotnet 跨线程访问(corss-threading)

       人们都知道不论不同类型的“JavaScript 虚拟机”表现如何,但最终“JavaScript”虚拟机在执行“JS”脚本代码时 在同一个时间段永远只允许有一个脚本执行,当然不排除“我行我素”的高端定制虚拟机允许并行处理,说实话这么搞起来还是挺不错的 不过有点就是不适合现在这个时代准确的说是这个国情。

       nsjsdotnet 提供了一组方法用于提供“跨线程”访问的支持,您可以利用它们轻松的构建跨线程访问的应用,有一点需要单独说明“跨线程访问”是有一定限制的,必须是“显示指定允许跨线程访问”的“JavaScript”引用(O)类型 才允许被跨线程访问,而基础的“JavaScript”值类型 并不需要显示声明“跨线程访问”。

       如何显示声明允许“跨线程访问”? 你可以将“NSJSValue::CrossThreading”指定为 True 则代表允许跨线程访问,另外一点你可以指定一个全局的默认值,即“NSJSVirtualMachine::CrossThreading”指定为 True,但它通常为 False;不过一旦你指定了全局的“允许跨线程”为 True,那么与此相关的每个“NSJSValue”的跨线程属性都将默认为 True,但这可能会影响到应用的效率与内存占用的问题,虽然当你的代码不在引用某个“NSJSValue”时“.NET GC”它可能会在某一段时间后自动调用“Finalize / 终结器”请求释放,但释放之前会存在短暂的内存泄漏,而假若当“.NET GC”没有释放它,那么“JavaScript GC”也将无法释放。

       但仅仅显示声明允许“跨线程访问”指定的“JavaScript”O类型,并不代表你可以直接在其它的不经允许的线程中访问它,而你需要在其它的线程内可以访问,那么只需要需要通过“NSJSVirtualMachine::Join”函数显示的请求当前线程临时加入到允许安全访问中,而一旦“NSJSVirtualMachine::Join”函数执行完毕平衡清理堆栈的时候,此线程将无法在访问到需求的被允许“跨线程访问”的“JavaScript”O类型。

using nsjsdotnet;
using System;
using System.Threading;

class Program
{
    static void __TEST(NSJSFunctionCallbackInfo arguments)
    {
        NSJSVirtualMachine machine = arguments.VirtualMachine;
        NSJSFunction callback = arguments[0] as NSJSFunction;
        callback.CrossThreading = true;
        ThreadPool.QueueUserWorkItem(delegate
        {
            machine.Join((sender, e) =>
            {
                callback.Call();
            });
        });
    }

    static void Main(string[] args)
    {
        NSJSVirtualMachine machine = new NSJSVirtualMachine();
        machine.AddFunction("__TEST", NSJSPinnedCollection.Pinned<NSJSFunctionCallback2>(__TEST));
        machine.Run("__TEST(function() { alert(1) })");
        Console.ReadLine();
    }
}

猜你喜欢

转载自blog.csdn.net/liulilittle/article/details/80494902
今日推荐