2010-03-15 79 views
1

我已经尝试了很多方法,下面是当前的迭代。我想我刚刚实施了这一切都是错误的。我试图完成的是以这样的方式处理这个异步结果,直到它返回并且我完成了我的添加缩略图调用,我将不会再请求调用imageProvider.BeginGetImage。使用Mutex在C#中执行异步操作的问题

要澄清,我的问题是双重的。为什么我所做的事似乎从未停止过我的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. 
       } 
      } 
     } 

回答

2

首先,

创建任务做了Parallel.ForEach运行调用一个委托一个方法。

三层次的并行性,其中1就足够了。

如果我读了这个权利,在委托内部你想用一个Mutex来一次只运行一个实例。

你能指出你想要并行发生的动作吗?

+0

*笑*是的,这是屠杀的结果。 执行如下: 用户界面调用开始布局,一旦命中任务,它返回。 该任务应该处理文件夹。我不确定为什么要有Parallel.ForEach,一个简单的forEach就足够了。 O_O一定是我甩掉代码的遗留物。 就是这样,只有AddThumbnail的一个实例应该一次运行它的关键部分。 – Firoso 2010-03-15 22:34:01