C# 如何在C WPF中复制FOR循环中的文件后更新TextBlock

C# 如何在C WPF中复制FOR循环中的文件后更新TextBlock,c#,wpf,xaml,C#,Wpf,Xaml,嗨,我想复制一些硬文件,在每次复制文本块后增加一个数字 foreach (string newPath in Directory.GetFiles(clipsSource, "*.*", SearchOption.AllDirectories)) { i++; File.Copy(newPath, newPath.Replace(clipsSource, Dest + "\\clips"), true); copyProgressLbl.Text = i.ToStr

嗨,我想复制一些硬文件,在每次复制文本块后增加一个数字

foreach (string newPath in Directory.GetFiles(clipsSource, "*.*", SearchOption.AllDirectories))
{
     i++;
     File.Copy(newPath, newPath.Replace(clipsSource, Dest + "\\clips"), true);
     copyProgressLbl.Text = i.ToString();
}
但TextBlock未在每个循环中更新
我该怎么办?

下面是一个示例,用于异步运行代码并更新TextBlock,使其不会阻塞UI

Task.Run(() =>
{
    foreach (string newPath in Directory.GetFiles(clipsSource, "*.*", SearchOption.AllDirectories))
    {
        i++;
        File.Copy(newPath, newPath.Replace(clipsSource, Dest + "\\clips"), true);
        Dispatcher.Invoke(() => copyProgressLbl.Text = i.ToString());
    }
});
想法是在任务中运行阻塞方法,并在需要时通过Dispatcher更新UI控件

如果无法使用任务,则使用线程池的替代方法

ThreadPool.QueueUserWorkItem(delegate
{
    foreach (string newPath in Directory.GetFiles(clipsSource, "*.*", SearchOption.AllDirectories))
    {
        i++;
        File.Copy(newPath, newPath.Replace(clipsSource, Dest + "\\clips"), true);
        Dispatcher.Invoke(() => copyProgressLbl.Text = i.ToString());
    }
});

虽然@pushpraj有一个正确的想法,异步调用您的更新代码,但使用此代码可能会更幸运:

foreach (string newPath in Directory.GetFiles(clipsSource, "*.*", SearchOption.AllDirectories))
{
    i++;
    File.Copy(newPath, newPath.Replace(clipsSource, Dest + "\\clips"), true);
    Task.Factory.StartNew(() => copyProgressLbl.Text = i.ToString());
}

您应该使用Dispatcher:text block Dod update,但您可能看不到它,因为循环在主线程中执行。您好,我无法在WPF run not Define和copyProgressLbl中运行此代码。text=I.ToString显示错误?您可能需要使用System.Threading.Tasks添加;在代码文件中。抛出的错误是什么?您使用的是哪个版本的.net?我使用.net 4,并使用System.Threading.Tasks添加;但仍然没有定义运行,这与任务有点奇怪。运行是在程序集mscorlib.dll v4.0.0.0中定义的,无论如何,您可能会使用第二种方法。pushpraj先生,它仍然不起作用,我更改了Dispatcher.Invoke=>copyProgressLbl.Text=I.ToString;to Dispatcher.Invokenew Action=>copyProgressLbl.Text=i.ToString;和代码运行,但每个循环中的TextBlock未更新。当此代码不工作时。但是当我在循环块中插入一个MessageBox时,TextBlock会被更新。。。。我不知道该怎么办!通常在WPF中,我们不会像您那样触摸UI元素。。。我们将数据属性绑定到UI元素属性,因此我们实际上是在这里更新字符串属性,而不是像您这样尝试手动更新文本框的文本属性。您可以尝试数据绑定。请尝试MSDN上的页面。对不起,我可以将'I'变量绑定到TextBlock的'Text'属性吗?您可以将任何字符串值绑定到TextBlock.Text属性。