【问题标题】:edge.js no response under windows formwindows窗体下edge.js无响应
【发布时间】:2015-12-22 09:26:15
【问题描述】:

以下给出 1-2 秒后的结果:

[STAThread]
        static  void Main()
        {
            //                        Application.EnableVisualStyles();
            //                        Application.SetCompatibleTextRenderingDefault(false);
            //                        Application.Run(new Form1());
            Task mainTask = MainAsync();
            mainTask.Wait();

        }
        static async Task MainAsync()
        {
            var func = Edge.Func(@"
            var esprima = require('esprima');
            var stringify = require('json-stable-stringify');

            var esprimaast = esprima.parse('var a=1;', { loc: true });
            var esprimaStr = stringify(esprimaast, { space: 3 });
            return function (data, callback) {
                callback(null, esprimaStr);
            }
           ");//end Edge.Func

            var result = await func(null);

            Console.WriteLine(result.ToString());
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            Object myresult = serializer.Deserialize<JSProgram>(result.ToString());

            Console.WriteLine(serializer.Serialize(myresult));



        }

但是当我使用 windows 窗体时

    [STAThread]
    static  void Main()
    {
                               Application.EnableVisualStyles();
                                Application.SetCompatibleTextRenderingDefault(false);
                               Application.Run(new Form1());

    }

并在按钮点击下触发它

 private void button1_Click(object sender, EventArgs e)
        {
            Task mainTask = MainAsync();
            mainTask.Wait();
        }

        async Task MainAsync()
        {
            var func = Edge.Func(@"
            var esprima = require('esprima');
            var stringify = require('json-stable-stringify');

            var esprimaast = esprima.parse('var a=1;', { loc: true });
            var esprimaStr = stringify(esprimaast, { space: 3 });
            return function (data, callback) {
                callback(null, esprimaStr);
            }
        ");//end of Edge.Func

            var result = await func(null);

            txtEsprima.Text = result.ToString();
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            Object myresult = serializer.Deserialize<JSProgram>(result.ToString());

           txtMe.Text=serializer.Serialize(myresult);



        }

完全没有回复,有什么问题?

【问题讨论】:

    标签: c# async-await edgejs


    【解决方案1】:

    您似乎遇到了通常的“将异步与.Result()/.Wait() 死锁混合”问题。您的 .Wait() 会阻止您的 WinForms UI 线程,直到任务完成。但是,在 Windows 消息循环上下文中,任务继续的方式是将执行继续委托的请求发布到消息循环。当您使用阻塞 .Wait() 停止消息循环时,您遇到了一个死锁,它将永远停留在那里。

    要解决此问题,请将 button1_Click() 设为异步,并使用 await mainTask 而不是 Wait()ing。

    原因在第一个示例中有效,因为您还没有活动的消息循环,因此延续策略不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      相关资源
      最近更新 更多