【发布时间】:2017-11-24 06:26:11
【问题描述】:
我必须调用我的 API 并显示等待 PictureBox(wait.gif) 直到 API 完成并返回数据以将我的自定义控件绑定到 tablepanellayout。
我不能在这里使用BackgroundWorker 类,因为它与我在自定义控件中的子控件存在跨线程问题。
这里我唯一的想法是从主线程调用子线程,但直到它被完全执行显示PictureBox(wait.gif) 并阻止要执行的其余代码。
任何人都可以建议我如何做到这一点,或者请提供一些代码 sn-p 例如。
【问题讨论】:
-
所以,您的代码中存在一些奇怪的问题,导致您无法使用非常基本的后台工作程序。然后你决定不修复它,而是创建一些hacky hack,它会阻塞主应用程序线程:即引入大量潜在错误和奇怪的难以修复的错误。只修复“自定义控件中的子控件”中的错误不是更好吗?
-
发布您的代码。没有人能猜出 your 代码有什么问题。 BGW 没有跨线程问题。它旨在通过在 UI 线程上引发进度事件来防止跨线程问题。如果您有跨线程问题,那是 您的 代码失败了。您很可能正在尝试从
DoWork事件内部修改 UI,而不是引发进度事件并在那里更新 UI -
所有你需要做的就是在调用
RunWorkerAsync之前改变背景,然后在UI线程中引发的RunWorkerCompleted事件中改变它。如果你想阻止人们使用UI 只是 禁用 表单,或使用模式启动屏幕。在这种情况下与线程无关 -
无论如何,您都不需要 Bgw 或 Thread 来显示 PictureBox。您的 UI 是单线程的。我们无法为您提供其他帮助,最好的解决方案是调用该 API async 并使用 await。
标签: c# multithreading api async-await backgroundworker