2010-03-15 78 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