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.
}
}
}
*笑*是的,這是屠殺的結果。 執行如下: 用戶界面調用開始佈局,一旦命中任務,它返回。 該任務應該處理文件夾。我不確定爲什麼要有Parallel.ForEach,一個簡單的forEach就足夠了。 O_O一定是我甩掉代碼的遺留物。 就是這樣,只有AddThumbnail的一個實例應該一次運行它的關鍵部分。 – Firoso 2010-03-15 22:34:01