Socket关闭在ZADD上

时间:2017-12-20 17:13:46

标签: c# async-await stackexchange.redis

我正在尝试有效地将75k +字符串(文件名)插入到redis排序集中以进行初始数据播种。有了这段代码,我得到的RedisConnectionException: SocketClosed on ZADD可能来自于同时发生的过多连接。如何解决此问题并改进我的代码以确保所有内容都成功添加?

List<string> filenames = new List<string> { "a.xml", "b.xml", "...etc 75k times" };
var tasks = new List<Task<bool>>();

using (ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(redisHost))
{
    IDatabase db = redis.GetDatabase();
    foreach (var filename in filenames)
    {
        tasks.Add(db.SortedSetAddAsync("files", filename, 0));
    }

    Console.WriteLine($"Task count: {tasks.Count}");
}

await Task.WhenAll(tasks.ToArray());

Console.WriteLine($"Successful: {tasks.Count(t => t.Result)}");

1 个答案:

答案 0 :(得分:2)

using确保ConnectionMultiplexer得到妥善处理。 但是它并不等待所有任务先完成。

您应该将Task.WhenAll移动到using statememnt。

using (ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(redisHost))
{
    IDatabase db = redis.GetDatabase();
    foreach (var filename in filenames)
    {
        tasks.Add(db.SortedSetAddAsync("files", filename, 0));
    }

    Console.WriteLine($"Task count: {tasks.Count}");

    await Task.WhenAll(tasks.ToArray());
}