下面是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);
}根本没有回复,有什么问题吗?
发布于 2015-12-23 06:26:16
似乎你遇到了常见的“与.Result()/.Wait()混合使用异步死锁”的问题。在任务完成之前,.Wait()会阻止WinForms UI线程。但是,在Windows消息循环上下文中,任务继续的方式是发布一个请求,以执行对消息循环的延续委托。当您使用阻塞的.Wait()停止消息循环时,您就会有一个死锁,并且它将永远留在那里。
要修复此问题,请将button1_Click()设置为异步,并将Wait()设置为await mainTask。
原因是在第一个示例中是有效的,因为您还没有活动的消息循环,所以继续策略是不同的。
https://stackoverflow.com/questions/34412402
复制相似问题