我移动文件
foreach(file){
file.move(file,dst);}
我想在移动每个文件(不同的分区)后更新一个表单,其中包含有关进度的信息。不幸的是,我的 WPF 表单在整个复制/移动队列中都很忙。我尝试了 InvalidateVisual(),但没有成功 - 在移动文件期间(或之后)我能做些什么来确保 GUI 响应能力?
我移动文件
foreach(file){
file.move(file,dst);}
我想在移动每个文件(不同的分区)后更新一个表单,其中包含有关进度的信息。不幸的是,我的 WPF 表单在整个复制/移动队列中都很忙。我尝试了 InvalidateVisual(),但没有成功 - 在移动文件期间(或之后)我能做些什么来确保 GUI 响应能力?
Kasan,我认为 BackgroundWorker 对你很有用。任务是不错的方法,但要从任务更新 UI 进度,您需要费心将事件分派到 UI 线程,否则您会收到异常,因为不允许从 UI 以外的线程更新 UI。这是一个示例和文档链接
public partial class MainWindow : Window
{
BackgroundWorker _worker = new BackgroundWorker();
public MainWindow()
{
InitializeComponent();
_worker = new BackgroundWorker();
_worker.DoWork += worker_DoWork;
_worker.ProgressChanged += worker_ProgressChanged;
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progress1.Value = e.ProgressPercentage;
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
_worker.RunWorkerAsync();
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
var files = new List<string>();
foreach(var file in files)
{
File.Move(file, /*target*/);
_worker.ReportProgress(/* here is progress from 0 to 100 */)
}
}
}
如果你想让你的 GUI 保持响应,你应该启动一个新线程来完成这个漫长的任务。
这样你的 GUI 线程就不会被这个长操作阻塞。
class example
{
static void UpdateStatus(int i)
{
// UpdateStatus
Console.WriteLine(i + "Done!");
}
static void Main(string[] args)
{
int state = 0;
Task t = Task.Run(
() =>
{
// do your stuff - this is going to run async
for (int i = 0; i < 10; i++)
file.move(file,dst);
UpdateStatus(i); // callback to update status
}
}
);
Console.WriteLine("Started"); // You wont block this code by running the async part
t.Wait();
Console.WriteLine("DONE");
Console.ReadKey();
}
}
在您的情况下,您可以这样使用:
Task t = Task.Run(
() =>
{
// do your stuff - this is going to run async
foreach(File file in Files){
{
move(file);
UpdateStatus(i); // callback to update status (eg.:how many files have been moved yet)
}
}
);