Какую структуру данных мне следует использовать для кэширования ресурсов при параллельной загрузке?C#

Место общения программистов C#
Ответить
Anonymous
 Какую структуру данных мне следует использовать для кэширования ресурсов при параллельной загрузке?

Сообщение Anonymous »

Я работаю на C#. Для моего проекта мне нужно загрузить некоторые ресурсы, у меня нет опыта работы с потоками, поэтому после некоторого поиска в Google я создал систему, которая работает в 90% случаев. Очевидно, что падение на 10 % не поможет, поэтому я надеюсь, что Мастер блокировки потоков скажет мне, что я делаю неправильно.
Я думаю, что моя главная проблема в том, что я не знаю, как правильно организовать данные, чтобы они были доступны для нескольких потоков. Любой вклад приветствуется :)
Вот сокращенная версия того, что я написал. Существует большое дерево ресурсов, многие из которых зависят от других ресурсов, без циклов. Я не знаю, какие ресурсы уже были загружены в кэш из предыдущих вызовов загрузки, поэтому мне нужно проверить. Проблема в том, что словарь не поддерживает одновременные операции, даже когда я блокирую идентификатор для доступа к ресурсу.
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»