3

C# ThreadPool を介して MongoDB にマルチスレッド挿入を実行する C# アプリケーションがあります。しかし、私はTimeoutException: Timeout waiting for a MongoConnection. MongoServer.RequestStart メソッドを使用しています。これは、接続を解放して MongoClient 接続プールに戻す必要があります。

また、スレッドプールには最小で 4 つ、最大で 8 つのスレッドがありますが、Mongo 接続プールにはデフォルトで 100 の接続があるため、接続が不足することはありません。

では、なぜこのエラーが発生するのでしょうか?

スレッドプールに渡されるメソッドは次のとおりです。_clientMongoClient インスタンス変数です。

public void BatchInsert(string collectionName, BinaryPacketDocument[] documents, int batchSize) {
        MongoServer server = _client.GetServer();
        MongoDatabase database = server.GetDatabase(_databaseName);
        using (server.RequestStart(database)) {
            MongoCollection collection = database.GetCollection(collectionName);
            collection.InsertBatch(documents);
            StatisticsManager.GetCounter("logs").Add(batchSize);    
        }
    }

そして、これをスレッドプールに渡す方法を次に示します。

private void SendWorkToThreadPool(string collectionName, BinaryPacketDocument[] documents, int batchSize) {
        if (documents.Length != 0) {
            ThreadPool.QueueUserWorkItem(state => _inserter.BatchInsert(collectionName, documents, batchSize)); 
        }
    }
4

1 に答える 1

1

スレッド プールが実際には 8 スレッドに制限されていないことに気付きました。ThreadPool.SetMax/Min スレッドへの引数の 1 つとして 0 を渡すと、最大値の設定に失敗します (明示的ではありません)。

于 2013-09-17T15:40:53.190 に答える