- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我要在MainForm进行一些数据库相关工作时显示带有进度栏的新表单。我读到您不想将UI传递给新线程,所以我想知道解决此问题的最佳解决方案是什么?
我无法在另一个线程上执行与数据库相关的工作,因为它使用了十二个对UI和MainForm的调用。我也不能使用Application.DoEvents()
,因为MainForm的线程正在类中工作,据我所知,您不应对类的父类进行任何调用。
任何建议,将不胜感激!
编辑
为了澄清我实际上想知道的事情:
我的程序看起来像这样:
... Content = DatabaseClass.LoadContent();
ApplyContentToUI(Content);
//Show a form here with a progressbar
... Content = DatabaseClass.LoadContent();
ApplyContentToUI(Content);
//Close the form here
//Show a form here with a progressbar
... Content = DatabaseClass.LoadContent();
//Close the form here
ApplyContentToUI(Content);
最佳答案
I can't do the database related work on another thread
Control.BeginInvoke
方法可用于异步操作(.NET 2.0+)。 BeginInvoke
用于在控件源自的线程上异步运行代码。如果发起线程是UI线程,这将允许进行UI操作。
BackgroundWorker
使用它来
ReportProgress
。这将允许UI在长时间运行的操作发生时保持响应。
BackgroundWorker
将在单独的线程上运行工作,并且它具有事件驱动的进度(.NET 2.0+)。 BackgroundWorker
是一个事件驱动的控件,它将在另一个线程上执行代码。它具有内置的功能,可以使用
ReportProgress
向监听器通知进度。
BackgroundWorker
使用
Control.BeginInvoke
作为
ReportProgress
,从而可以有效分离业务逻辑。
Dispatcher
可以将操作中继到UI线程(.NET 3.0+)。 Dispatcher
是为WPF添加的,但仍可以在WinForms中使用(尽管不太理想)。
Dispatcher
的功能与
BeginInvoke
相同,并且可以同步运行或异步运行。
Task(T)
类,可以很容易地将逻辑与UI线程交织在一起。 (带有TPL包的.NET 4.0 + 、. NET 3.5+)。 Task
是消息驱动的,并允许封装非阻塞操作。这也是.NET 4.5
async
/
await
模式的基础。
Task
用于流式处理操作,以便可以将它们链接在一起并产生结果。比
BackgroundWorker
更加简化,并且可以更好地进行操作组合。这也使
producer-consumer scenarios的实现更加简单。
关于c# - 在主线程忙时连续更新UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17531106/
根据https://developers.google.com/google-apps/calendar/v3/reference/freebusy/query处的文档要执行空闲/忙碌查询,您必须在正
我在启动 Apache 后使用 XAMPP 1.7.7 我收到此警报: Busy... Apache started [Port 80] 我已经打开了 httpd.conf 文件,并将端口号更改为 8
我有端口问题。 每当我启动 Apache 时,它都会给我这个错误: Busy - Apache Started [port 80] 当我启动 Mysql 时出现以下错误: Busy - ERROR
当我运行我的代码时,我总是得到后台工作人员很忙。有帮助吗? struct FtpSetting { public string Server { get; set
在我们的 Android 和 iOS MVVMCross 应用程序中,我们偶尔会遇到 SQLiteException: busy 异常。 给定下面的代码,我们有几个存储库,每个存储库都构造一个下面的实
每次运行解决方案(20 projs)时,我都会收到此错误。我尝试禁用 UI 选项、resharper、删除未使用的扩展等,但仍然无法通过此错误。 我使用的是 VS 2015 Update 2 Ente
我正在使用这个插件 https://github.com/mozilla/rust-android-gradle ,这需要我添加 tasks.whenTaskAdded { task -> i
我是一名优秀的程序员,十分优秀!