首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >windows窗体下的edge.js无响应

windows窗体下的edge.js无响应
EN

Stack Overflow用户
提问于 2015-12-22 17:26:15
回答 1查看 196关注 0票数 0

下面是1-2秒后的结果:

代码语言:javascript
复制
[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窗体时,

代码语言:javascript
复制
    [STAThread]
    static  void Main()
    {
                               Application.EnableVisualStyles();
                                Application.SetCompatibleTextRenderingDefault(false);
                               Application.Run(new Form1());

    }

并在按钮点击下触发它

代码语言:javascript
复制
 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);



        }

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

EN

回答 1

Stack Overflow用户

发布于 2015-12-23 06:26:16

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34412402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档