异步任务C#
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了异步任务C#,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1770字,纯文字阅读大概需要3分钟。
内容图文
我试图了解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
为什么它同步运行?
解决方法:
当您运行代码时,第一个工作程序将开始工作,然后下一个工作程序将陷入您所拥有的繁忙循环中,而(Workers> 0);并且不会继续前进,直到前一个工作人员完成为止.然后,当它启动时,下一个工作线程将被卡在那里,依此类推,对于您启动工作线程的循环的每次迭代.
因此,您最多只能有一名工人在工作,而一名工人则将整个CPU固定在那里等待其完成.
编写异步代码时同步访问的一种正确方法是使用SemaphoreSlim并使用WaitAsync,它会异步等待直到可以获取信号量,而不是同步阻塞线程(并在运行时挂住CPU).其他工人要完成.它也具有可以安全地从多个线程进行访问的优点,这与不安全地从多个线程进行更改的整数不同.
内容总结
以上是互联网集市为您收集整理的异步任务C#全部内容,希望文章能够帮你解决异步任务C#所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。