2015-12-22 7 views
0

Следующая дает результат через 1-2 секунды:edge.js нет ответа под окнами формы

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



     } 

Ответ отсутствует, в чем проблема?

ответ

0

Возможно, вы столкнулись с обычным «асинхронным микс» с .Result()/.Wait() тупиковой проблемой. Ваш .Wait() блокирует поток пользовательского интерфейса WinForms, пока задача не будет завершена. Однако в контексте цикла сообщений Windows способ, которым выполняется Задача, заключается в отправке запроса на выполнение делегата продолжения в цикл сообщения. Поскольку вы остановили цикл сообщений с блокировкой .Wait(), у вас есть тупик, и он останется там навсегда.

Чтобы исправить, сделайте button1_Click() async и await mainTask вместо Wait() Для этого.

Причина в том, что в первом примере у вас нет активного цикла сообщений, поэтому стратегия продолжения отличается.