C#异步方法调用

时间:2014-11-24 08:22:52

标签: c# asynchronous

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

我将从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");
}

我首先输出&#34;测试&#34;,在#34; leaved&#34;之前,我该如何练习?

3 个答案:

答案 0 :(得分:0)

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

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
}

答案 1 :(得分:0)

你可以这样做

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");
        });
    }

答案 2 :(得分:0)

您可以使用任务。在这种情况下,您不需要将函数标记为异步:

    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");
    }