• 在.Net中执行js


    利用Noesis.Javascript开源组件可以做到在.net中执行js脚本,同时js脚本也能调用C#函数。这个组件的获得方式:在NuGet中输入搜索"Noesis"就能找到。

    我们来做个搜索功能:用户能够在textbox中输入js脚本来筛选list记录,界面如下:

    然后,click filter button后的UI:

    看,筛选出来了,代码如下(js能调C#写的UserInfo类的各个属性)

    public class UserInfo
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public int Age { get; set; }
            public override string ToString()
            {
                return string.Format("{0}, {1}: {2}", FirstName, LastName, Age);
            }
        }
    
    private void btnSearch_Click(object sender, EventArgs e)
            {
                List<UserInfo> users = FilterUsers(txtFilter.Text.Trim());
                lstUsers.DataSource = users;
            }
    
            private List<UserInfo> FilterUsers(string jsFilter)
            {
                List<UserInfo> results = new List<UserInfo>();
                if (jsFilter.Trim().Length == 0)
                    return this.users;
    
                try
                {
                    using (JavascriptContext context = new JavascriptContext())
                    {
                        foreach (UserInfo user in this.users)
                        {
                            context.SetParameter("user", user);
                            context.SetParameter("isInclude", false);
                            string js = string.Format(@"
                                                    if({0})
                                                        isInclude=true;
                                                    else
                                                        isInclude=false;", jsFilter);
                            context.Run(js);
                            bool isInclude = (bool)context.GetParameter("isInclude");
                            if (isInclude)
                                results.Add(user);
                        }
                    }
                }
                catch
                {
                    txtFilter.Focus();
                    txtFilter.SelectAll();
                    return this.users;
                }
    
                return results;
            }

    我们来看看效率:

    private void btnTest_Click(object sender, EventArgs e)
            {
                using (JavascriptContext context = new JavascriptContext())
                {
                    Stopwatch sw = new Stopwatch();
                    sw.Start();
                    int i=1000000;
                    while(i-- > 0)
                    {
                        context.SetParameter("ii", 1);
                        context.SetParameter("jj", 2);
                        context.SetParameter("sum", 0);
                        string js = string.Format(@"sum=ii+jj;");
                        context.Run(js);
                        int sum = (int)context.GetParameter("sum");
                    }
                    sw.Stop();
    
                    long useJS_Total = sw.ElapsedMilliseconds;
                    float useJS_Average = ((float)sw.ElapsedMilliseconds) / 1000000;
    
                    sw.Reset();
                    sw.Start();
                    i = 1000000;
                    while (i-- > 0)
                    {
                        int ii = 1;
                        int jj = 2;
                        int sum = 0;
                        sum = ii + jj;
                    }
                    sw.Stop();
    
                    long nouseJS_Total = sw.ElapsedMilliseconds;
                    float nouseJS_Average = ((float)sw.ElapsedMilliseconds) / 1000000;
    
                    string msg = "";
                    msg += string.Format("useJS_Total: {0}
    ", useJS_Total);
                    msg += string.Format("useJS_Average: {0}
    
    
    ", useJS_Average);
                    msg += string.Format("nouseJS_Total: {0}
    ", nouseJS_Total);
                    msg += string.Format("nouseJS_Average: {0}
    
    
    ", nouseJS_Average);
    
                    MessageBox.Show(msg);
                }
            }

    结果(上面的是通过js引擎计算的时间、下面的是纯C#计算时间,悲剧啊):

    结论:

    1. 这个Noesis.Javascript只适用于性能要求不高的场合
    2. 高性能的要看Lua
  • 相关阅读:
    在ElementUI的 MessageBox 弹框 进行api接口请求
    Vue 报错 (Emitted value instead of an instance of Error) the "scope" attribute for scoped slots have been deprecated and replaced by "slot-scope" since 2.5. The new "slot-scope" attribute can also be u
    子组件 修改父组件的属性值
    1、Flutter---配置
    Vant轮播预览图片
    vue 中 v-for 和 :key 配套使用
    js--两数之和
    blazor 中没有 blazor WebAssembly App 模板
    Deepin 安装vue-cli
    C# Linq Join & Lambda Join
  • 原文地址:https://www.cnblogs.com/aarond/p/Noesis.html
Copyright © 2020-2023  润新知