0

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



        }

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

4

1 回答 1

0

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

要修复,请进行button1_Click()异步,而await mainTask不是Wait()为它设置。

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

于 2015-12-22T22:26:16.083 回答