如何在 WPF C# 中处理时保持 UI 畅通

问题描述 投票:0回答:1

我已经阅读了很多有关线程和异步的示例...,但是我无法使 wpf c# 中的 UI 在计算磁盘上的文件时不冻结 - 我无法移动窗口...,我必须等待计数过程结束。 计数完成后,将恢复对用户界面的控制。

我的按钮代码和文本框中的计数结果

    public static long DirSize(DirectoryInfo d)
{

    long size = 0;
    FileInfo[] fis = d.GetFiles();
    foreach (FileInfo fi in fis)
        try
        {
            {
                size += fi.Length;
            }
        }
        catch
        {

        }

   private async void Save_bkp_Click(object sender, RoutedEventArgs e)
  {

   await Task.Run(() =>
   {
       Dispatcher.Invoke(new Action(() => {

           TextBox_Dimensioni.Text = Convert.ToString((double)DirSize(new DirectoryInfo(CopiaFoto)));

       }));
   });

  }

如果我不输入

Dispatcher.Invoke
,我会收到错误:调用线程无法访问此对象,因为此对象由另一个线程拥有。 我尝试了很多方法,但没有什么总是冻结......

wpf multithreading user-interface async-await freeze
1个回答
0
投票

运行任务中长时间运行的部分并

await
它。然后用结果更新控件。

这将小心地返回到初始同步上下文(UI 线程)。

private async void Save_bkp_Click(object sender, RoutedEventArgs e)
{
    var size = await Task.Run( () => DirSize( new DirectoryInfo(CopiaFoto) ) );
    TextBox_Dimensioni.Text = size.ToString();
}
© www.soinside.com 2019 - 2024. All rights reserved.