c# - 使用多个线程来处理一个大列表?
问题描述
我被分配了将大量 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 个项目,而没有想到另一个任务会做同样的事情?
解决方案
这是我将从哪里开始的示例:
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);
}
}
推荐阅读
- reactjs - 错误:错误:无法从`index.js`解析模块`./node_modules/react-navigation-stack/dist/views/Header/HeaderTitle`:
- microsoft-graph-api - 具有图形 API 的 SPFx Web 部件不返回来宾用户 companyName
- azure-active-directory - Azure LUIS 聊天机器人在添加安全性后无法正常工作
- python - 如何在python中从经纬度查找人口普查区
- yaml - 当键在 yq 中带有点时读取值
- c++ - 从模板抽象类继承
- android - 可安装为 APK 的 Android 应用程序的大小限制
- linux - sched_rt_runtime_us 与 sched_rt_period_us 的比率未显示在 Linux 的“顶部”中
- python - 使用 scapy 发送 RTP 数据包并在上限中查看它
- c++ - 将文本(字体)转换为 ABGR 缓冲区