首页 > 解决方案 > 使用多个线程来处理一个大列表?

问题描述

我被分配了将大量 id 列表(400 万)转换为用户名的任务。为此,我决定将多项任务委托给我的高级代理。

public class ProxyWorker
{
    private static int _proxyCount;

    static void Run(List<long> largeList)
    {
        var taskList = new List<Task>();

        for (int i = 0; i < _proxyCount; i++)
        {
            taskList.Add(Task.Factory.StartNew(() => ConvertOnProxy(i, largeList.Take(1000).ToList())));
        }

        Task.WaitAll(taskList.ToArray());
    }

    static void ConvertOnProxy(int proxyId, List<long> idsToConvert)
    {
        // TODO
    }
}

我被困在如何将 1,000 个任务委派给每个任务,在它们被选中后将它们从列表中删除,以便另一个线程不会占用它们,并保持线程安全?

我知道我当前的代码只是抓取了 1,000 个项目,而没有想到另一个任务会做同样的事情?

标签: c#.net

解决方案


这是我将从哪里开始的示例:

static async Task Test()
{
    Queue<int> ids = new Queue<int>(Enumerable.Range(0, 100));
    List<Task> tasks = new List<Task>();

    for (int i = 0; i < 8; i++)
    {
        tasks.Add(DoTheThings(ids));
    }

    await Task.WhenAll(tasks);
}

static async Task DoTheThings(Queue<int> ids)
{
    Random rnd = new Random();
    int id;

    for (;;)
    {
        lock (ids)
        {
            if (ids.Count == 0)
            {
                // All done.
                return;
            }

            id = ids.Dequeue();
        }

        Debug.WriteLine($"Fetching ID {id}...");

        // Simulate variable network delay.
        await Task.Delay(rnd.Next(200) + 50);
    }
}

推荐阅读