【问题标题】:How to execute each iteration of the loop in one thread with task?如何在一个带有任务的线程中执行循环的每次迭代?
【发布时间】:2013-10-27 04:05:04
【问题描述】:

我有一个检查一些数据的方法,我想知道如何在不同的线程中检查这些数据。我正在使用任务和异步/等待模式。

private bool my myCheckMethod(List<long> paramData)
{
     //code that check the information in the list
}


private void mainMethod()
{
    //1.- get data from the data base
    //2.- i group the data from the database in many lists.

    foreach(list<List<long>> iterator in myListOfLists)
    {
          myCheckMethod(itrator);
    }
}

但我希望 myCheckMethod 不是一次只执行一个,而是使用任务同时执行多个。我认为这将花费更少的时间。

但是,我不知道该怎么做。我尝试这样的事情:

private void mainMethod()
{
    //1.- get data from the data base
    //2.- i group the data from the database in many lists.

    string initTime = System.DateTime.String();
    foreach(list<List<long>> iterator in myListOfLists)
    {
          myCheckMethod(itrator);
    }

    string endTime = System.DateTime.String();
}

我想知道何时开始检查以及检查所有列表时的信息。

我尝试这样的事情:

private void mainMethod()
    {
        //1.- get data from the data base
        //2.- i group the data from the database in many lists.

        string startTime = System.DateTime.String();
        foreach(list<List<long>> iterator in myListOfLists)
        {
             TaskEx.Run(() =>
             {
                myCheckMethod(itrator);
             });
        }

        string endTime = System.DateTime.String();
    }

但在这种情况下,开始时间和结束时间是相同的,因为我不等待任务。所以我尝试了另一个选项:

private void mainMethod()
    {
        //1.- get data from the data base
        //2.- i group the data from the database in many lists.

        string startTime = System.DateTime.String();
        foreach(list<List<long>> iterator in myListOfLists)
        {
             TaskEx.Run(() =>
             {
                myCheckMethod(itrator);
             }).wait();
        }

        string endTime = System.DateTime.String();
    }

但在这种情况下,只同时执行一个 myCheckMethod,因为我正在等待完成一个以继续下一次迭代。

那么如何同时执行多个检查方法呢?

【问题讨论】:

  • 如果你不需要结果,为什么还需要使用 async/await?你不能简单地使用 Parallel.ForEach 吗?
  • 您的代码不会在任何地方使用async/await。此外,async/await 不会导致代码异步运行,它等待已经启动的异步操作。

标签: c# c#-4.0 task-parallel-library


【解决方案1】:
var sw = Stopwatch.StartNew();
var pendingTasks =
  myListOfLists
    .Select(iterator => TaskEx.Run(() => myCheckMethod(iterator))).ToArray();
Task.WaitAll(pendingTasks);
var elapsedTime = sw.Elapsed;

【讨论】:

    猜你喜欢
    • 2021-06-07
    • 1970-01-01
    • 2016-10-31
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 2017-04-28
    相关资源
    最近更新 更多