C# 异步方法调用

本文关键字:调用 异步方法 | 更新日期: 2023-09-27 18:31:36

我会对函数进行异步调用,如下所示:

我将从main方法调用一个方法,这个函数应该是异步的,我怎么做?

举个小例子:

private static void Main(string[] args)
{
    StartDoingNothingAsync();
    Console.WriteLine("test");
    Console.Read();
}
private static async void StartDoingNothingAsync()
{
    for (var i = 0; i < 5000; i++)
    {
        //do something
    }
    Console.WriteLine("leaved");
}

我会先输出"测试",然后再"离开",我该如何练习?

C# 异步方法调用

最简单的选择是在异步方法中引入延迟:

private static async void StartDoingNothingAsync()
{
    await Task.Delay(1000);
    // This will be called on a thread-pool thread
    Console.WriteLine("leaved");
}

这并不能保证test会在leaved之前打印出来,但似乎很有可能。如果你真的想要一个保证,你必须把一些东西传递到StartDoingNothingAsync中,然后在打印test发出信号......但目前还不清楚你想实现什么。

请注意,异步方法几乎不应该void - 基本上这仅适用于允许异步事件处理程序。改为使方法返回Task - 这样调用代码就可以知道它何时完成。(即使你在这种情况下不使用该事实,这也是一个好习惯。

现在我们有了更多关于您要实现的目标的信息,我建议不要StartDoingNothingAsync作为异步方法 - 只需使用任务即可:

private static void Main(string[] args)
{
    Task task = Task.Run(DoSomething);
    Console.WriteLine("test");
    task.Wait();
    Console.Read();
}
static void DoSomething()
{
    // Code to run on a separate thread
}

你可以这样做

private static void Main(string[] args)
    {
        StartDoingNothingAsync();
        Console.WriteLine("test");
        Console.Read();
    }
    private static async void StartDoingNothingAsync()
    {
        await Task.Run(async delegate()
        {
            for (var i = 0; i < 5000; i++)
            {
                //do something
            }
            Console.WriteLine("leaved");
        });
    }

您可以使用 Task 来实现此目的。在这种情况下,您无需将函数标记为异步:

    private static void Main(string[] args)
    {
        new Task(StartDoingNothing).Start();
        Console.WriteLine("test");
        Console.Read();
    }
    private static void StartDoingNothing()
    {
        for (var i = 0; i < 5000; i++)
        {
            //do something
        }
        Console.WriteLine("leaved");
    }