Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中使用互斥体执行异步操作时出现问题_C#_.net_Asynchronous - Fatal编程技术网

在C#中使用互斥体执行异步操作时出现问题

在C#中使用互斥体执行异步操作时出现问题,c#,.net,asynchronous,C#,.net,Asynchronous,我已经尝试了很多方法,这里是当前的迭代。我想我只是把这一切都搞错了。我试图实现的是以这样一种方式处理这个异步结果,在它返回并完成add-thumbnail调用之前,我不会请求对imageProvider.BeginGetImage的另一个调用 澄清一下,我的问题有两个方面。为什么我正在做的事情似乎从未在我的Mutex.WaitOne()调用中停止过,而处理这种情况的正确方法是什么? /// <summary> /// re-creates a list

我已经尝试了很多方法,这里是当前的迭代。我想我只是把这一切都搞错了。我试图实现的是以这样一种方式处理这个异步结果,在它返回并完成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.
                }
            }
        }
//
///从TreeElementViewModels(目录)列表重新创建缩略图列表
/// 
///要处理的TreeElementViewModels列表
公共void BeginLayout(列表)
{
//*删除了用于取消和清除以前调用的代码*
//并行启动所有文件夹的处理。
Task.Factory.StartNew(()=>
{
thumbnailRequests=Parallel.ForEach(列表、选项、ProcessFolder);
});
}
/// 
///处理文件夹的所有映像路径并从磁盘加载它们。
/// 
///要处理的树元素
私有void ProcessFolder(aitreelementviewmodel元素)
{
尝试
{
var images=ImageCrawler.getimagepath(element.Path);
AsyncCallback=AddThumbnail;
foreach(图像中的var图像)
{
控制台写入线(“尝试输入”);
synchMutex.WaitOne();
控制台。写入线(“输入”);
var result=imageProvider.BeginGetImage(回调,图像);
}
}
捕获(异常exc)
{
Console.WriteLine(exc.ToString());
//托多:在这里做点什么。
}
}
/// 
///将缩略图添加到浏览器中
/// 
///用于从加载任务检索状态数据的异步结果。
私有void add缩略图(IAsyncResult结果)
{
锁(缩略图)
{
尝试
{
流图像=imageProvider.EndGetImage(结果);
字符串文件名=imageProvider.GetImageName(结果);
字符串imagePath=imageProvider.GetImagePath(结果);
var imageviewmodel=新的AiImageThumbnailViewModel(图像、文件名、图像路径);
thumbnailHash[imagePath]=imageviewmodel;
HostInvoke(()=>Thumbnails.Add(imageviewmodel));
UpdateChildZoom();
//synchMutex.ReleaseMutex();
控制台写入线(“退出”);
}
捕获(异常exc)
{
Console.WriteLine(exc.ToString());
//托多:在这里做点什么。
}
}
}
首先

创建一个任务来执行Parallel.ForEach以运行调用委托的方法

三级并行,其中1级就足够了

如果我读对了,在委托内部,您希望使用互斥锁一次只运行一个实例

你们能指出你们希望同时发生的行动吗?

笑是的,这是屠宰的结果。执行如下:UI调用Begin Layout,点击任务后返回。然后,任务应处理文件夹。我不知道为什么有平行的ForEach,一个简单的ForEach就足够了。O_O一定是我破解密码后留下的。没错,一次应该只有一个AddThumbnail实例运行它的关键部分。