繁体   English   中英

异步任务c#

[英]Asynchronous tasks c#

我试图理解C#中的异步编程。 我创建了一个只能调用一次的函数示例。 例如从大文件中读取。 我想创建一个查询,请求将在查询中等待,直到他们可以安全地读取文件。

AsyncWork aw = new AsyncWork();

Task.Run(() => {
    for (int count = 0; count < 10; count++) {
        aw.DoAsyncWork(count);
        Console.WriteLine("request added");
    }
});
Console.ReadKey();

AsyncWork

public class AsyncWork {
    int Requests = 0;
    int Workers = 0;

    public AsyncWork() { }

    public async Task DoAsyncWork(int count) {
        Requests++;

        while (Workers > 0) ;

        Workers++;
        Requests--;

        if (Workers > 1) Console.WriteLine("MORE WORKERS AT ONCE");

        Console.WriteLine(count.ToString() + " Started task");
        //reading from file
        await Task.Delay(1000);
        Console.WriteLine(count.ToString() + " Ended task");

        Workers--;
    }
}

我预计我将有10个请求,然后它们将逐个完成。 但输出如下:

0 Started task
request added
0 Ended task
1 Started task
request added
1 Ended task
2 Started task
request added
2 Ended task
3 Started task
request added
3 Ended task
4 Started task
request added
4 Ended task
5 Started task
request added
5 Ended task
6 Started task
request added
6 Ended task
7 Started task
request added
7 Ended task
8 Started task
request added
8 Ended task
9 Started task
request added
9 Ended task

为什么它同步运行?

当您运行代码时,您的第一个工作人员将开始工作,然后下一个将陷入您拥有的繁忙循环中, while (Workers > 0) ; 并且在前一个工人完成之前不会继续前进。 然后,当它启动时,下一个工作者将被卡在那里,依此类推,对于启动工作程序的循环的每次迭代。

所以你最多只有一名工人在做工作,一名工人盯着坐在那里等待它完成的整个CPU。

在编写异步代码时同步访问的一种正确方法是使用SemaphoreSlim并使用WaitAsync ,它将异步等待直到可以获取信号量,而不是同步阻塞线程(并在你使用它时将CPU挂起)其他工人完成。 它也有被安全从多个线程访问,不像一个整数这是不是安全地从多个线程改变的优势。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM