【发布时间】:2013-12-16 19:45:08
【问题描述】:
用例
我正在用 C# 开发一个小应用程序,它被另一个应用程序调用以从 Internet 检索数据。它作为一个独立的进程运行,但几乎所有与它的交互都由调用应用程序管理。因此它没有图形用户界面。但是,我想使用 WPF 添加一个进度条,该进度条在某些可能需要一分钟的数据检索期间显示。估计完成了多少工作以及剩下多少工作相当容易,因此我找到了一个合适的进度条。
研究完成
在阅读了 Albahari 的关于线程的 pdf 的大部分内容 (http://www.albahari.info/threading/threading.pdf) 之后,我对线程有了相当的了解。在这件事上,我还阅读了很多关于 SO 和 MSDN 的帖子。大多数帖子建议使用后台工作者进行耗时的数据检索,同时将 GUI 保留在主线程中,因此建议使用后台工作者的解决方案。但是在这种情况下感觉很尴尬,主要任务是数据检索而不是 GUI 交互。
我花了很多时间试图理解不同的教程和论坛帖子,同时试图使它们符合我的问题,但我没有成功,现在我几乎回到了原点。基本上我想最终得到以下两个类:
进度条窗口
public partial class ProgressBarWindow : Window
{
public ProgressBarWindow()
{
InitializeComponent();
}
public void setValue(int value)
{
// This function should be available from the main thread
}
}
查询器
Public class Querier
{
public List<Item> getItems()
{
// call ProgressBarWindow.setValue(0);
...
// call ProgressBarWindow.setValue(100);
// call ProgressBarWindow.Close();
}
}
我的理解是 UI 必须在单线程下运行,因此我的 ProgressBarWindow 对象无法在新线程中实例化,同时可用于主线程(有点)。
Dispatcher.BeginInvoke 似乎是我的救星,但到目前为止,我还无法弄清楚 Querier 类中应该包含哪些内容以及 ProgressBarWindow 类中应该包含哪些内容。如何让两个线程与同一个 ProgressBarWindow 实例交互?
请询问您是否需要更多详细信息,我会尽力澄清。
【问题讨论】:
-
请避免使用
setXXX()和getXXX()语法。它看起来很像java,我快要吐了。取而代之的是,使用类似 C# 的代码并创建适当的属性。 -
点了!我通常会尝试。
标签: c# wpf multithreading