Я думаю, что моя главная проблема в том, что я не знаю, как правильно организовать данные, чтобы они были доступны для нескольких потоков. Любой вклад приветствуется
Вот сокращенная версия того, что я написал. Существует большое дерево ресурсов, многие из которых зависят от других ресурсов, без циклов. Я не знаю, какие ресурсы уже были загружены в кэш из предыдущих вызовов загрузки, поэтому мне нужно проверить. Проблема в том, что словарь не поддерживает одновременные операции, даже когда я блокирую идентификатор для доступа к ресурсу.
using System;
using System.Collections.Generic;
using System.Linq;
using Sourceage.IO.Interface;
using Sourceage.Element;
using System.ComponentModel;
using System.Threading.Tasks;
using System.Threading;
namespace NameSpace
{
public class Progress
{
private float _value;
private BackgroundWorker _worker;
public Progress(BackgroundWorker worker)
{
_worker = worker;
}
public void Report(float value)
{
lock(this)
{
_value += value;
_worker.ReportProgress((int)_value);
}
}
}
public class MyClass
{
//Id to factory function, accepting an array of dependencies
private Dictionary _idToFactory = new();
//Id to function providing dependency ids
private Dictionary _idToDeps = new();
//Id to cashed instance of resource
private Dictionary _cashe = new();
//Creates a background worker for loading the given resource
public BackgroundWorker CreateLoadWorker(int id, Action postWork = null)
{
var worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
void worker_DoWork(object sender, DoWorkEventArgs e)
{
worker.ReportProgress(1);
var progress = new Progress(worker);
var idToDep = new Dictionary
Подробнее здесь: https://stackoverflow.com/questions/791 ... in-paralle
Мобильная версия