【发布时间】:2016-09-24 15:38:01
【问题描述】:
我是 C# 的新手,现在我正在尝试通过提出自己的示例来学习 async 和 await。但我在实施它时遇到了麻烦。基本上我是从 MSDN 偷来这个例子的:https://msdn.microsoft.com/en-us/library/system.collections.ienumerable(v=vs.110).aspx
但在 main 方法中,我放的是:
static void Main(string[] args)
{
Person[] pArray = new Person[100];
//populate first 50 people
//TODO: USE ASYNC
//populate last 50 people
//TODO: USE ASYNC
//await here
People peopleList = new People(pArray);
//do some linq
Console.ReadKey();
}
我真的不知道如何实现 TODO 部分(我也不确定这是否是你的方式)。我应该创建一个与 main 并行的任务方法吗?但是 pArray 不会以这种方式是全局的,并且任务函数不应该能够修改变量,对吧?我想知道你如何实现这一点。任何提示将不胜感激!
谢谢!
【问题讨论】:
-
我担心这不是学习如何使用
await(或更一般地说,并发/异步/并行)的好方法。首先,您要避免任何共享状态(在这种情况下,pArray) - 相反,您最好让每个异步方法返回它们自己的数据部分,然后将它们重新放在一起主线程。其次,您需要确保await有可以返回的地方——在您的代码中,Main将在您点击第一个await后立即结束并杀死所有内容。尝试 www.albahari.com/threading/ 作为入门:) -
我可能错了,但数组不是线程安全的。所以你应该先从线程安全的集合开始。然后,您可以根据需要继续用线程填充它。或者在每个线程中使用对象的保存实例来锁定 pArray 对其进行操作。否则致命的多线程世界不会怜悯你。 ;) * 线程安全集合:msdn.microsoft.com/en-us/library/dd997305(v=vs.110).aspx 如何锁定:msdn.microsoft.com/en-us/library/c5kehkcz.aspx
-
@Luaan 如果我将其更改为 pArray1 和 pArray2,每个长度为 50?我希望它们同时填充,以便稍后我可以等待并在这两个数组上执行一些 linq?
-
@Anatolyevich 假设每个线程都在数组的单独部分上工作,它是线程安全的。见this related question。
标签: c# multithreading async-await concurrent-programming