5

对于以下代码(使用EdgeJS模块),我想等待异步方法Start完成后再写sw.Elapsed,我该怎么做?

using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using EdgeJs;
static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    /// 
    [STAThread]
    static  void Main()
    {
        //            Application.EnableVisualStyles();
        //            Application.SetCompatibleTextRenderingDefault(false);
        //            Application.Run(new Form1());

        Stopwatch sw =new Stopwatch();
        sw.Start();
        Task.Run((Action)Start).Wait();
        //wait for start to complete --- how should I do it??
        sw.Stop();
        Console.WriteLine(sw.Elapsed);
    }


    public static async void Start()
    {
        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, 'Node.js welcomes ' + esprimaStr);
        }
    ");

        Console.WriteLine(await func(".NET"));
        //Console.WriteLine("hello");
    }
}
4

3 回答 3

4

除了异步事件处理程序之外,您不能等待async void您不应该使用的操作。async void

async void当你滥用它时有几个问题。抛出的异常async void不会被我的常规方法捕获,并且在大多数情况下会使您的应用程序崩溃。

当您期望返回值时,您应该始终使用async Taskor 。async Task<T>

有关/的一些指南,请参阅此MSDN 帖子asyncawait

于 2015-12-20T10:06:31.140 回答
2

这个问题你可能会使用

sw.Start().GetAwaiter().GetResult;

或者

Task.WaitAll(sw.Start());

分别来自Stephen ClearySnOrfus的回答。希望能帮助到你。

于 2017-10-11T14:59:46.720 回答
1

好吧,问题在于 Everything 源自同步 Main() 方法。如果您想编写异步代码,那么一个好的开始方法是创建一个异步 Main 方法并在那里编写您的程序代码(我最近回答了一个类似的问题)。

class Program
{

    static void Main(string[] args)
    {
        Task mainTask = MainAsync(args);
        mainTask.Wait();
        // Instead of writing more code here, use the MainAsync-method as your new Main()
    }

    static async Task MainAsync(string[] args)
    {
        // Write your programs code here, You can freely use the async / await pattern
    }
}

结合允许您的“开始”方法返回这样的任务:

public static async Task Start()
{
    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, 'Node.js welcomes ' + esprimaStr);
        }
    ");

    Console.WriteLine(await func(".NET"));

    //Console.WriteLine("hello");
}

将允许您在 MainAsync 方法中调用 Start 方法,如下所示:

static async Task MainAsync(string[] args)
{
    Stopwatch sw = new Stopwatch();
    sw.Start();
    await Start();
    //wait for start to complete --- how should I do it??
    sw.Stop();
    Console.WriteLine(sw.Elapsed);
}

我无法对此进行测试,因为我不知道静态“Edge”类的来源。但这是我开始思考的好地方。

于 2015-12-20T10:24:19.880 回答