关于c#:试图理解异步和等待

Trying to understand async and await

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

示例代码。在下面的async方法中,indexasync方法能否在相应的get*方法完成之前实际返回?我试图理解Async和Wait的基本原理,就像作者提到的那样。

作者代码:https://www.exceptionnotfound.net/using-async-and-await-in-asp-net-what-do-these-keywords-mean/

因此,根据我现在的理解,以下是真的:
异步方法的好处是,当执行到get*方法的调用时,它们不必等待,因此后面的代码可以执行,当get*方法最终返回其值时,indexasync最终可以返回。总结一下?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
public class ContentManagement
{
    public string GetContent()
    {
        Thread.Sleep(2000);
        return"content";
    }

    public int GetCount()
    {
        Thread.Sleep(5000);
        return 4;
    }

    public string GetName()
    {
        Thread.Sleep(3000);
        return"Matthew";
    }
    public async Task<string> GetContentAsync()
    {
        await Task.Delay(2000);
        return"content";
    }

    public async Task<int> GetCountAsync()
    {
        await Task.Delay(5000);
        return 4;
    }

    public async Task<string> GetNameAsync()
    {
        await Task.Delay(3000);
        return"Matthew";
    }
}



public class HomeController : Controller
{
    [HttpGet]
    public ActionResult Index()
    {
        Stopwatch watch = new Stopwatch();
        watch.Start();
        ContentManagement service = new ContentManagement();
        var content = service.GetContent();
        var count = service.GetCount();
        var name = service.GetName();

        watch.Stop();
        ViewBag.WatchMilliseconds = watch.ElapsedMilliseconds;
        return View();
    }

    [HttpGet]
    public async Task<ActionResult> IndexAsync()
    {
        Stopwatch watch = new Stopwatch();
        watch.Start();
        ContentManagement service = new ContentManagement();
        var contentTask = service.GetContentAsync();
        var countTask = service.GetCountAsync();
        var nameTask = service.GetNameAsync();

        var content = await contentTask;
        var count = await countTask;
        var name = await nameTask;
        watch.Stop();
        ViewBag.WatchMilliseconds = watch.ElapsedMilliseconds;
        return View("Index");
    }
}


当你呼叫您的异步调用非只是电话,电话是正常的。执行动作的方法GetContent样,和你运行的线程数milliseconds睡的时间。电话是在线程的执行,体操,但只是睡在每个呼叫。

你是asyncIndexAsync感知方法。什么是做在幕后建立一个异步状态机的执行代码。

当你service.GetContentAsync();电话呼叫,这是getcontentasync,但所有的字是该函数开始执行,然后,当它获取到await Task.Delay(3000);承诺(A,它返回到IndexAsync)在执行完成后(有时增加到那个任务)。

之后,你await演练任务。这是一个invokes状态机。在其他的方法后,等待着一包)是在lambda和排队最当其完成任务执行的信号。然而,在执行你的代码,你是暂停和运行的线程在线程被释放回池是靠近(无论它来自或其他)。例如,如果它是一个WinForms和WPF UI线程在一个应用程序,它会回到服务的用户界面。

当工作条件,其余的代码开始运行了。在用户界面的应用程序(WinForms和WPF的类),有一个担保,如果你开始在UI线程,其余的代码将运行在同一线程上。在其他的环境,可能不参与担保。

如果你有一个具有网页的JavaScript和Ajax调用自编服务器给回你的设置,你是要调用的参数,和一个"跑,当调用函数返回。在awaited方法调用(或awaiting任务——有点像是挺)。它调用的函数的参数,但其他包裹上的流函数形式,在一个执行任务的条件。

在异步A /福利院等待着UI应用是显而易见的,它允许时序规划,而非UI线程处理得到安静。

这是一位不明显,在ASP.NET的环境。线程是珍贵的商品,在Web服务器应用程序。我在等待着给你/异步Web应用程序是一个有背景的处理方式(多是用异步请求到webapi说一些没有销售服务与请求的线程上。当你等待着任务的线程去,回到游泳池。当工作条件,你得到一回和contineuse线程代码


在使用时await是进步的,是暂停和控制是在屈服前回电话的方法。在操作执行,无论是NOR久(直到块A之后的时间)。

我很乐于助人msdoc审查这个例子。