- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 C#/WPF(.Net 框架 4.0)编写一个应用程序。我遇到的一件事是如何在应用程序非常繁忙时更新控件(如果可能)。我想我只是在努力尝试我在网上找到的东西来让它工作(而且在极少数情况下它会工作)。该应用程序有四个类,一个主窗口类、一个 Worker1 类和一个 Worker2 类以及一个静态 ExtensionMethods 类。 Worker2 从 Worker1 调用并完成大部分工作。当它运行时,CPU 为 100%(核心为 100%,系统有四个核心)。 (所有都在同一个命名空间中。)
public static class ExtensionMethods
{
private static Action EmptyDelegate = delegate() { };
public static void Refresh(this UIElement uiElement)
{
uiElement.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Render, EmptyDelegate);
}
}
主窗口调用 Worker1 中的顶层函数,它经过一些设置然后开始漫长的过程,它是这样的:
MainWindow mainWindow = App.Current.MainWindow as MainWindow;
mainWindow.dispatcher_UpdateProgressBarMaximum(maxValue);
int count=0;
Worker2 worker2 = new Worker2();
while (bytesRead =(readData() !=0) {
count++;
worker2.doWork();
mainWindow.dispatcher_UpdateProgressBar(count);
}
在mainWindow类中是:
dispatcher_UpdateProgressBar(int Value)
{
Dispatcher.BeginInvoke(new Action(() => myProgressBar.Value = value), null);
myProgressBar.Refresh();
}
(我也尝试过:myProgressBar.Dispatcher.Begin...等等
但两者都不重要。对于有 2 或 3 次读取的小文件,我可以看到进度条正在更新。但是对于大文件,直到最后才更新。这也发生在我显示一些状态信息的一些标签控件上。整个工作完成后,我可以选择显示一个消息框,说明已完成的工作。对于标签,当我显示消息框时,标签会更新。该应用程序可以一个接一个地处理许多文件。
我考虑过使用后台线程,但不确定该怎么做。也就是说,worker2.doWork() 部分非常密集,但如果它在它自己的线程上,mainWindow.dispatcher_Update...将在线程开始后立即被调用,并且没有什么可以阻止下一次读取的发生,对吧?
也许按照我的编码方式是不可能的。如果我使用 Backgroundworker,该类会在主窗口或 Worker1 中实例化吗?即使是一两个指针也会很棒。
最佳答案
在 .NET 4.5 中,他们添加了 IProgress<T>
接口(interface)和 Progress<T>
允许您从另一个线程报告进度的类,如果 Progress
它将自动在 UI 线程上运行回调在那里创建了对象。
因为您使用的是 .NET 4.0,所以您并非完全不走运,Microsoft 将这些类发布为 Out of band update通过 NuGet 包到框架 Microsoft.BCL它将这两个类反向移植到 .NET 4.0。
一旦你有Progress<T>
它相当易于使用。
void StartWorker()
{
var progress = new Progress<int>(UpdateProgressBar);
worker1.Start(progress)
}
void UpdateProgressBar(int Value)
{
//This code is invoked on the UI thread
myProgressBar.Value = value;
}
//Elsewhere in Worker1
void Start(IProgress<int> progress)
{
int count=0;
Worker2 worker2 = new Worker2();
while (bytesRead =(readData() !=0)
{
count++;
worker2.doWork();
progress.Report(count);
}
}
然而,尽管如此,您还是应该尝试重新考虑您的数据模型。 “拥抱 WPF”并开始使用像 MVVM 这样的概念设置绑定(bind)并更新数据对象,然后更新您的 UI(并且您可以将所有 UI 编码代码放入 ViewModel 的 OnPropertyChanged
事件中)。
关于c# - 从另一个类更新 Progressbar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20643569/
我的应用程序中有一个 ProgressBar 小部件,无论我做什么,它总是显示为粗橙色(2.x 样式)而不是细蓝色(4.x 样式) . 项目构建目标设置为 Google API 4.0.3(API 级
private static ProgressDialog pDialog; pDialog = new ProgressDialog(activity); pDialog.setIndetermin
我试图让 TalkBack 阅读进度条上的进度,但运气不佳。关于如何获取该信息以便 TalkBack 可以说出来的任何想法。 谢谢 公共(public)类 MainActivity 扩展 Activi
进度条总是返回null public void calcola(View view) { final Dialog myDialog = new Dialog(this);
我正在尝试用选取框样式测试进度条,但没有成功 private void Form1_Load(object sender, EventArgs e) { Applica
我使用以下 Ruby 片段下载 a 8.9MB file . require 'open-uri' require 'net/http' require 'uri' def http_download
我为操作栏按钮尝试了两种不同的进度条样式,通过 refreshMenuItem.setActionView(R.layout.actionbar_indeterminate_progress); ac
每当我输入 fragment 时,我都会看到几秒钟的空白,然后 WebView 中的网页就会出现。 ProgressBar 好像没有显示。 这是我的 XML 文件,用于 WebView 和 Progr
我的包依赖于一个名为 progressbar 的包。有一个bug in progressbar 2.3导致Python>3.3安装失败,因此我安装了latest git repo from this
任何默认的 ProgressBar 都有一个 ClipDrawable 级别,例如,一个绿色的 Drawable 在我的设备上填充灰色背景,在其他设备上填充黄色。 我的问题:当进度小于最大值时,是否可
这是随意的原型(prototype)代码,因此我尝试了我认为应该有效的方法,如果没有,则在谷歌上搜索,然后在仔细阅读类似问题后在这里提问。 我的 Shell 中有以下标记看法:
要在执行查询时显示 ProgressBar,我使用以下代码: if not Query1.Prepared then Query1.Prepare; Query1.Open; ProgressBa
我有三个类,例如 View 、逻辑、 Controller 。 class View{ Progressbutton pb; void start animation(){
我正在用 C#/WPF(.Net 框架 4.0)编写一个应用程序。我遇到的一件事是如何在应用程序非常繁忙时更新控件(如果可能)。我想我只是在努力尝试我在网上找到的东西来让它工作(而且在极少数情况下它会
要在执行查询时显示 ProgressBar,我使用以下代码: if not Query1.Prepared then Query1.Prepare; Query1.Open; ProgressBa
已关闭。此问题不符合 Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 已关闭 3 年前。 奥 git _a
我创建了一个 ping 程序来 ping 5 服务器。如何在进度运行时让进度条运行。当 ping 完成时,进度条将为 100% private void btnGetstatusActionPer
我想在流程完成后在 PrimeFaces 上隐藏一个进度条。我认为没有必要在不工作时显示进度条。 html代码:
我想添加JProgressBar,它将在下载文件的程序中填充。 第三个问题是如何使进度条在 setValue 中添加正确的金额(例如:当它下载最后一个文件时,JPB 将完成)。 请注意,要下载的文件数
给定一个变量 N,反射(reflect)秒数,我想要一个 jQueryUI Progressbar顺利地从空更新到反射(reflect)该时间段内的完成。 换句话说,我想要一个显示进度条的functi
我是一名优秀的程序员,十分优秀!