Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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# WPF异步任务错误未触发_C#_Wpf - Fatal编程技术网

C# WPF异步任务错误未触发

C# WPF异步任务错误未触发,c#,wpf,C#,Wpf,也许我在这里完全迷路了,但我最难弄清楚是什么导致我的任务过早退出,到目前为止,任何错误处理尝试都失败了。问题是我在一个文件系统中单步遍历数百个目录,所以不可能通过单步调试找到失败的地方,而且我还需要处理错误。这是我到目前为止所拥有的 WPF按钮触发的按钮代码 private void BtnCopy_Click(object sender, RoutedEventArgs e) { Dispatcher.Invoke(() => { BtnBrowse.IsEnabled = false;

也许我在这里完全迷路了,但我最难弄清楚是什么导致我的任务过早退出,到目前为止,任何错误处理尝试都失败了。问题是我在一个文件系统中单步遍历数百个目录,所以不可能通过单步调试找到失败的地方,而且我还需要处理错误。这是我到目前为止所拥有的

WPF按钮触发的按钮代码

private void BtnCopy_Click(object sender, RoutedEventArgs e)
{
Dispatcher.Invoke(() => { BtnBrowse.IsEnabled = false; BtnCopy.IsEnabled = false; });

var task = Task.Run(() =>
{
  try
  {
    _ = RunCopy();
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  }
});
}
task.ContinueWith((t) => { Dispatcher.Invoke(() => { BtnBrowse.IsEnabled = true; BtnCopy.IsEnabled = true; }); });
此消息框从不显示。 在我的RunCopy代码中,我在目录中的文件夹中循环

private async Task RunCopy()
{
foreach (var folder in firstDirInfo.GetDirectories())
{
  if (folder.Name.Contains(customerNumber))
  {
    await CopyTask(firstDirInfo + @"\" + folder, customerNumber);
  }
}
}
CopyTask是最终出错的事件

private async Task CopyTask(string directory, string customerNumber)
{
var dirInfo = new DirectoryInfo(directory);

            //Create root folder
            var createFolder = copyToDir + @"\" + dirInfo.Name;
            if (!Directory.Exists(createFolder))
                Directory.CreateDirectory(createFolder);

            foreach (var folder in dirInfo.GetDirectories())
            {
                var sourceFolder = directory + @"\" + folder.Name; 
                var targetFolder = createFolder + @"\" + folder.Name;

                //Create target path if it doesn't exist
                if (!Directory.Exists(targetFolder))
                    Directory.CreateDirectory(targetFolder);

                //Now Create all of the directories
                foreach (var dirPath in Directory.GetDirectories(sourceFolder, "*", SearchOption.AllDirectories))
                {
                    if (!Directory.Exists(dirPath))
                        Directory.CreateDirectory(dirPath);
                }

                //Gather copy information
                foreach (var newPath in Directory.GetFiles(sourceFolder, "*.*", SearchOption.AllDirectories))
                {
                    masterDic.Add(newPath, newPath.Replace(sourceFolder, targetFolder));
                }
            }
}
如果这是为了最终运行一个异步文件拷贝,我只是先收集文件信息并创建目录,以便稍后处理进度条。它在名称错误的CopyTask任务中出错

最终,我只是想弄清楚如何处理错误。 任何指导都会大有裨益。
谢谢

立即发现一个错误:

try
{
    _ = RunCopy();
}
必须等待,否则Try块无法捕获任务中的任何异常。 而BtnCopy\u Click必须变为异步

private async void BtnCopy_Click(object sender, RoutedEventArgs e)
{
    Dispatcher.Invoke(() => { BtnBrowse.IsEnabled = false; BtnCopy.IsEnabled = false; });

    try
    {
      await RunCopy();
    }
    catch (Exception ex)
    {
      MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
    }

    Dispatcher.Invoke(() => { BtnBrowse.IsEnabled = true; BtnCopy.IsEnabled = true; });   

立即发现一个错误:

try
{
    _ = RunCopy();
}
必须等待,否则Try块无法捕获任务中的任何异常。 而BtnCopy\u Click必须变为异步

private async void BtnCopy_Click(object sender, RoutedEventArgs e)
{
    Dispatcher.Invoke(() => { BtnBrowse.IsEnabled = false; BtnCopy.IsEnabled = false; });

    try
    {
      await RunCopy();
    }
    catch (Exception ex)
    {
      MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
    }

    Dispatcher.Invoke(() => { BtnBrowse.IsEnabled = true; BtnCopy.IsEnabled = true; });   

可能是当您调用Task.Run时,您将工作推到另一个非UI线程上,因此您的catch块正由该后台线程处理,并且无法访问UI。任务将向调用线程返回任何未处理的异常,因此可以尝试将catch块移到任务之外。谢谢@ChrisBrenberg是我的ProgressBar调用引发了我最终发现的错误。可能是当你调用Task.Run时,你将工作推到了另一个非UI线程上,因此你的catch块正由该后台线程处理,并且没有访问UI的权限。任务将向调用线程返回任何未处理的异常,因此可以尝试将catch块移到任务之外。谢谢@ChrisBrenberg是我的ProgressBar调用抛出了我最终发现的错误。谢谢,我能够使用wait命令使其工作,非常感谢!谢谢你,我可以让它与等待命令一起工作,谢谢!