JArray(Json.net)多线程访问导致“集合被修改”

时间:2015-05-22 11:41:45

标签: c#

我正在使用异步IO来读取文件并计算文件块的哈希值(使用多个线程)并存储到JArray中。在阅读之前,我创建了具有块数的JArray,并且线程将继续使用hash更新JArray。我需要找出数组是否没有任何空值,表明文件读取已经完成。

var t = j.Children().Where(s => (s.Type == JTokenType.Null));
count = t.Count();

我收到了异常

  

收藏被修改;枚举操作可能无法执行。

有没有办法让计数在原子上独立于线程。

我正在使用c#Threadpool来处理数据。

FileTransferThreadPool fftp = new FileTransferThreadPool();
ResultData rd = new ResultData(aol, data, hash);
fftp.Queue(rd);

public FileTransferThreadPool(int threadpoolsize = 2)
{
    public bool Queue(ResultData rd){
        ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), rd);
        return true;
    }

    static void ThreadProc(Object stateInfo)
    {
        JObject jo = aol.root;
        JArray j = (JArray)jo["hash"];
        j[(int)aol.number] = hash;
        var te = j.Children().Where(s => (s.Type == JTokenType.Null));
        count = te.Count();
    }
}

0 个答案:

没有答案