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

时间:2015-12-22 09:26:15

标签: c# async-await edgejs

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



        }

根本没有回复,问题是什么?

1 个答案:

答案 0 :(得分:0)

似乎你已经违反常规&#34;混合异步与.Result() / .Wait()死锁&#34;问题。您的.Wait()会阻止WinForms UI线程,直到任务完成。但是,在Windows消息循环上下文中,Task继续的方式是将请求执行继续委托发布到消息循环。当您使用阻止.Wait()停止了消息循环时,您会遇到死锁,并且会永远停留在那里。

要修复此问题,请button1_Click()异步,await mainTask代替Wait()

原因是第一个例子中的作品是你还没有活跃的消息循环,所以延续策略是不同的。