使用async和await分别填充列表

时间:2016-05-26 14:44:02

标签: c# multithreading async-await concurrent-programming

我是C#的新手,现在我正在尝试学习异步并等待我提出自己的例子。但我在实施它时遇到了麻烦。基本上我从MSDN上偷了这个例子:https://msdn.microsoft.com/en-us/library/system.collections.ienumerable(v=vs.110).aspx

但是在主要方法中,而不是那里,我把:

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不会以这种方式成为全球性的,任务功能不应该能够修改变量,对吗?我想知道你如何实现这一点。任何提示将不胜感激!

谢谢!

1 个答案:

答案 0 :(得分:1)

如果开始使I / O绑定操作异步,那么学习succeeded / @FXML private void addOfficeBarrierSelect() { App.getInstance().showProgressIndicator(myController); Task<ScreensController> task = new Task<Void>() { @Override protected ScreensController call() throws Exception { ScreensController colllectScreenController = new ScreensController(); colllectScreenController.loadScreen(Screens.ADD_OFFICE_BARRIER); colllectScreenController.setScreen(Screens.ADD_OFFICE_BARRIER); return colllectScreenController; } @Override protected void succeeded() { super.succeeded(); content.setContent(getValue()); App.getInstance().hideProgressIndicator(myController); } @Override protected void failed() { super.failed(); App.getInstance().hideProgressIndicator(myController); } }; new Thread(task).start(); } 要容易得多。只创建async并将它们添加到数组是CPU绑定的,而不是I / O绑定。

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

People

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