异步C#

Asynchronous C#

本问题已经有最佳答案,请猛点这里访问。

我有一个关于两个关键字的问题(异步和等待)他们的主要目标是使多个方法在我理解的同时完成,因此,例如,如果我要做一个长任务,这将阻止在这种情况下执行主任务,我必须使用(异步和等待)。

但当我在两个执行相同操作的不同程序中尝试时,我发现使用(async和wait)执行的是相同的w/o。

第一个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    class Async
{
    public Async()
    {
        main();
    }

    public async void main()
    {
        Console.WriteLine("Main Thread....");
        await SlowTask();
        Console.WriteLine("Back To Main Thread");
    }

    public async Task SlowTask()
    {
        Console.WriteLine("Useless Thread....");
        for (int i = 0; i < 1000000; i++)
        {
            // TODO
        }
        Console.WriteLine("Finished Useless Thread....");
    }
}

第二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    class NoAsync
{
    public NoAsync()
    {
        main();
    }
    public void main()
    {
        Console.WriteLine("Main Thread....");
        SlowTask();
        Console.WriteLine("Back To Main Thread");
    }
    public void SlowTask()
    {
        Console.WriteLine("Useless Thread....");
        for (int i = 0; i < 1000000; i++)
        {
            // TODO
        }
        Console.WriteLine("Finished Useless Thread....");
    }
}

两者的执行是完全相同的,据我所知,当使用(async和await)时,main和slowtask将同时执行,而不等待一个结束,这样另一个开始执行,但不会发生这种情况。

我犯了什么错误,或者我没有理解C中的异步?亲切的问候。


我希望两人的处决是一样的。问题是后者,您对C中的异步有误解。

简言之,当你在async方法中使用await时,该线程被释放去做其他事情,直到await完成任务。但在awaited方法完成之前,程序不会继续执行下一行。那将是香蕉。你更像是一个背景工作者。

例如,当您进行I/O并希望同时有一个线程可用于字段HTTP请求时,这很方便。关于这方面的阅读材料已经很多了。下面是一个更深入的答案


执行应该完全相同,它们是逻辑上一致的程序。考虑到整个程序只是增加一个计数器变量,可能甚至没有一个任务切换。