Что такое хороший шаблон для многопоточности в приложении IOC (windsor) - PullRequest
0 голосов
/ 05 октября 2010

Я пишу простое приложение для загрузки фотографий с использованием IOC. Существует довольно простой список шагов. Получить список фотографий для скачивания. Проверьте это, проверьте это, затем загрузите. Загрузка может быть выполнена через FTP в некоторых случаях и через http в других, и через веб-сервис в других.

Что меня интересует, так как я новичок в земле МОК, - это то, что является хорошим шаблоном для ускорения 10 «потоков загрузки» с использованием лучших практик / шаблонов разработки МОК.

Я использую Castle Windsor, но могу легко переключиться на StructureMap или Spring, так как я нахожусь в начале процесса.

РЕДАКТИРОВАТЬ: Чтобы было ясно, я понимаю, как создать интерфейс IPhotoDownloader и затем 3 конкретных класса Photodownloader, но я не совсем понимаю, как управлять потоками и как узнать, когда все сделано во всех потоках и продолжить.

Второе редактирование в ответ на комментарии: Насколько я понимаю, было бы плохо напрямую ссылаться на конкретный класс в приложении IOC, поэтому, если бы я захотел, например, использовать ThreadPool.QueueUserWorkItem для многопоточности моего загрузчика, как бы я это сделал. Буду ли я просто использовать контейнер для определения конкретного класса, который я хочу, в каждом потоке внутри моего метода запуска потока? как:

void StartThead(){
PhotoRetriever retriever = container.Resolve<PhotoRetriever>();
}

1 Ответ

0 голосов
/ 06 октября 2010

Krysztof заставил меня начать на правильном пути, в основном я видел странное поведение, когда делал что-то вроде этого:

    _fileList = new Stack<Uri>();
            for (int i = 0; i < 10; i++)
            {
                _fileList.Push(new Uri("http://mi.mirror.garr.it/mirrors/postfix/index.html"));
                _fileList.Push(new Uri("ftp://mi.mirror.garr.it/mirrors/postfix/index.html"));
                _fileList.Push(new Uri("http://www.google.com/adsense/static/it/LocalizedTerms.html"));
                _fileList.Push(new Uri("http://www.cnn.com"));
            }

            _handles = new ManualResetEvent[ThreadCount];
            _watch.Start();

            // fire up threadCount threads to download files
            for (int i = 0; i < ThreadCount; i++)
            {
                _handles[i] = new ManualResetEvent(false);
                ThreadPool.QueueUserWorkItem(new WaitCallback(downloadThread), i);
            }

            // wait for all threads to finish
            WaitHandle.WaitAll(_handles);

................

 private void downloadThread(object stateInformation)
        {
            var retriever = _IOCContainer.Resolve<HtmlTitleRetriever>();

while (fileUri! = Null) {

            var fName = retriever.DownLoadFile(fileUri);


.....

Поведение, которое я видел, было связано с тем, что я не знал о свойствах времени жизни, по умолчанию Singleton, когда на самом деле мне нужно было использовать PerThread в этом случае.

...