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