【发布时间】:2010-12-31 20:06:35
【问题描述】:
好吧,我想做的是在读取一个充满文件的目录时显示一个动画 gif,但是 UI 冻结,这没关系,但我想保持 gif 运行直到操作完成。有什么想法吗?
我正在使用 VS2010 C# 在 Windows 窗体上进行此操作
【问题讨论】:
好吧,我想做的是在读取一个充满文件的目录时显示一个动画 gif,但是 UI 冻结,这没关系,但我想保持 gif 运行直到操作完成。有什么想法吗?
我正在使用 VS2010 C# 在 Windows 窗体上进行此操作
【问题讨论】:
这里是一些示例代码,您可以如何异步加载文件。也许它可以帮助你。比起使用 DoEvents,我更喜欢这种方式。使用 DoEvents 我已经有了一些不好的副作用,因此我尽量不使用它。
BackgroundWorker bgWorker = new BackgroundWorker() { WorkerReportsProgress=true};
bgWorker.DoWork += (s, e) => {
// Load here your file/s
// Use bgWorker.ReportProgress(); to report the current progress
};
bgWorker.ProgressChanged+=(s,e)=>{
// Here you will be informed about progress and here it is save to change/show progress. You can access from here savely a ProgressBars or another control.
};
bgWorker.RunWorkerCompleted += (s, e) => {
// Here you will be informed if the job is done.
// Use this event to unlock your gui
};
bgWorker.RunWorkerAsync();
【讨论】:
你有两个选择。
启动一个单独的线程来处理文件操作。
在文件循环中定期调用 Application.DoEvents()。这将导致您的应用程序处理待处理的消息(从而更新您的 UI),但会对文件处理循环的速度产生负面影响。
从我的手机发帖,所以没有示例链接。
【讨论】:
运行枚举是一个单独的线程并在主线程中更新GUI。
【讨论】:
这样的东西可以与 backgroundWorker 一起使用吗?
private void buttonRename_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
foreach (ListViewItem myitem in listView.Items)
{
try
{
//Rename
}
catch
{
}
}
}
【讨论】: