簡體   English   中英

WPF 異步任務錯誤未觸發

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM