[英]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.