【问题标题】:Populating list separately using async and await [closed]使用 async 和 await 分别填充列表 [关闭]
【发布时间】: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


【解决方案1】:

如果您从使 I/O 绑定操作异步开始,那么学习 async/await 会容易得多。仅创建 People 并将它们添加到数组中是 CPU 绑定的,而不是 I/O 绑定的。

对于async,您希望从 I/O 开始。例如,您可能想下载 Google 的主页:

var client = new HttpClient();
var result = await client.GetStringAsync("http://www.google.com/");

此外,使用 UI 应用程序而不是控制台应用程序更容易学习 await。因此,将上面的代码粘贴到按钮单击事件中,看看会发生什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2019-05-29
    • 1970-01-01
    • 2021-09-20
    • 2019-08-06
    • 1970-01-01
    相关资源
    最近更新 更多