[英]WPF async task errors not firing
也許我在這里完全迷失了,但我很難弄清楚是什么導致我的任務過早退出,並且到目前為止任何錯誤處理嘗試都失敗了。 問題是我正在遍歷文件系統中的數百個目錄,因此不可能通過單步調試來找到我失敗的地方,而且無論如何我都需要處理錯誤。 這是我到目前為止所擁有的。
由 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_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; });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.