edge.js在windows窗体下没有响应



以下在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));

        }

但是当我使用窗口形式时

    [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);

        }

根本没有回复,问题出在哪里?

似乎遇到了常见的"混合异步与.Result()/.Wait()死锁"问题。.Wait()会阻止WinForms UI线程,直到任务完成。但是,在Windows消息循环上下文中,任务继续的方式是向消息循环发布执行继续委托的请求。由于您已经用阻塞的.Wait()停止了消息循环,因此出现了死锁,它将永远保持在那里。

要修复此问题,请将button1_Click()设为异步,并将await mainTask而不是Wait()设为异步。

在第一个例子中之所以有效,是因为您还没有活动的消息循环,所以延续策略不同。

相关内容

  • 没有找到相关文章

最新更新