c# - 如何等待异步方法在 C# 中完成?

标签 c# asynchronous edgejs

下面的代码(使用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");
    }
}

最佳答案

你不能等待 async void操作你不应该使用 async void除了异步事件处理程序。

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

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

查看此 MSDN post有关 async 的一些指南/await .

关于c# - 如何等待异步方法在 C# 中完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34379810/

相关文章:

c# - 在 C# 中遍历 windows 文件系统中文件的权限

c++ - 异步函数错误

javascript - Edge.js 从 Expandoobject 转换为字符串

c# - Electron-Edge-JS App.config

c# - 数组求和缺失时的预期缓存效果

c# - MVC 和 EditorFor 宽度

c# - 使用 Unity 跨多种类型注入(inject)相同的 DataContext 实例

VB.NET 进程 BeginOutputReadLine 不工作

.net - 取消异步操作