Проблемы с асинхронными операциями в C # с использованием Mutex - PullRequest
1 голос
/ 16 марта 2010

Я пробовал это МНОГИМИ способами, вот текущая итерация. Я думаю, что только что реализовал все это неправильно. Я пытаюсь обработать этот результат Asynch таким образом, чтобы до тех пор, пока он не вернется и я не закончу свой вызов add-thumbnail, я не буду запрашивать другой вызов imageProvider.BeginGetImage.

Чтобы уточнить, мой вопрос двоякий. Почему то, что я делаю, никогда не останавливается при моем вызове Mutex.WaitOne (), и как правильно обрабатывать этот сценарий?

        /// <summary>
        /// re-creates a list of thumbnails from a list of TreeElementViewModels (directories)
        /// </summary>
        /// <param name="list">the list of TreeElementViewModels to process</param>
        public void BeginLayout(List<AiTreeElementViewModel> list)
        {
            // *removed code for canceling and cleanup from previous calls*

            // Starts the processing of all folders in parallel.
            Task.Factory.StartNew(() =>
                {
                    thumbnailRequests = Parallel.ForEach<AiTreeElementViewModel>(list, options, ProcessFolder);
                });
        }

        /// <summary>
        /// Processes a folder for all of it's image paths and loads them from disk.
        /// </summary>
        /// <param name="element">the tree element to process</param>
        private void ProcessFolder(AiTreeElementViewModel element)
        {
            try
            {
                var images = ImageCrawler.GetImagePaths(element.Path);

                AsyncCallback callback = AddThumbnail;

                foreach (var image in images)
                {
                     Console.WriteLine("Attempting Enter");

                     synchMutex.WaitOne();     

                     Console.WriteLine("Entered");

                     var result = imageProvider.BeginGetImage(callback, image);
                }
            }
            catch (Exception exc)
            {
                Console.WriteLine(exc.ToString());
                // TODO: Do Something here.
            }
        }

        /// <summary>
        /// Adds a thumbnail to the Browser
        /// </summary>
        /// <param name="result">an async result used for retrieving state data from the load task.</param>
        private void AddThumbnail(IAsyncResult result)
        {
            lock (Thumbnails)
            {
                try
                {
                    Stream image = imageProvider.EndGetImage(result);
                    string filename = imageProvider.GetImageName(result);
                    string imagePath = imageProvider.GetImagePath(result);
                    var imageviewmodel = new AiImageThumbnailViewModel(image, filename, imagePath);
                    thumbnailHash[imagePath] = imageviewmodel;
                    HostInvoke(() => Thumbnails.Add(imageviewmodel));
                    UpdateChildZoom();
                    //synchMutex.ReleaseMutex();
                    Console.WriteLine("Exited");
                }
                catch (Exception exc)
                {
                    Console.WriteLine(exc.ToString());
                    // TODO: Do Something here.
                }
            }
        }

1 Ответ

2 голосов
/ 16 марта 2010

Для начала,

вы создаете Задачу для выполнения Parallel.ForEach для запуска метода, который вызывает делегат.

Три уровня параллелизма, где 1 будет достаточно.

И если я правильно понял, внутри делегата вы хотите использовать Mutex для запуска только 1 экземпляра за раз.

Не могли бы вы указать, какие действия вы хотите выполнять параллельно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...