Как мне обрабатывать обновления потоков во внутреннем словаре, возможно, после выхода из thread.delegate? - PullRequest
0 голосов
/ 19 января 2011

У меня есть N потоков, каждый из которых сохраняет данные в переменную private Dictionary<string,myObject> myUploadObject с областью действия объекта экземпляра.

Как только в этом словаре будет достаточно данных или по прошествии 2 минут я отправлю эту коллекцию на сервер.

Я никогда не сталкивался с этой многопоточной ситуацией и не уверен, как к этому подойти. Вот как я запускаю свой исходный код:

        PerfmonClient agent = new PerfmonClient(Machine, Start, Stop, Interval, MaxIterations);
        Thread newThread = null;
        Console.WriteLine("Creating new thread: " + agent.ToThreadName());
        ThreadStart threadDelegate = new ThreadStart(agent.TestLoop);
        newThread = new Thread(threadDelegate);
        agent.AssociatedThread = newThread;
        AgentDictionary.Add(agent.ToThreadName(), agent);
        newThread.Start();

Теперь я пытаюсь извлечь данные из объекта agent и отправить их на сервер. Обычно я бы просто вызывал другой метод в экземпляре PerfmonClient для этого, но концепция многопоточности заставляет меня дважды проверить свой подход.

Вот несколько способов, которыми я собираюсь взять эти собранные данные и отправить их на сервер:

  • Создать новый ThreadDelegate для метода agent.upload, загрузить и запустить его (основной поток или порожденный поток)

  • Измените внутренний объект Dictionary<string,myObject> myUploadObject на открытый и статический, и используйте поток threadDelegate / Main для выполнения загрузки.

  • ?? Не уверены, что произойдет, если начальный agent.TestLoop завершится или произойдет ошибка? Я теряю все данные в объекте agent? Как мне получить доступ к внутренним данным, когда thread.IsActive == false?

Спасибо, что ответили на эти вопросы ... или указали мне правильное направление. Я не уверен, что я заново изобретаю колесо, и, возможно, мне придется изучить что-то новое.

1 Ответ

1 голос
/ 19 января 2011

У меня будет центральный поток загрузки, который предоставляет метод AddPerformanceData для добавления данных о производительности, которые могут вызывать потоки сбора. Этот метод использует блокировку и сохраняет данные внутри. Затем поток загрузки отправляет эти данные по порядку, используя блокировку доступа.

Преимущество этого в том, что вам не нужны блокировки потоков потоков, поскольку никто не получает доступ к их данным - вы в основном сериализуете загрузку через поток загрузчика.

...