我已经阅读了很多有关线程和异步的示例...,但是我无法使 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
,我会收到错误:调用线程无法访问此对象,因为此对象由另一个线程拥有。
我尝试了很多方法,但没有什么总是冻结......
运行任务中长时间运行的部分并
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();
}