用例
我正在开发一个C#中的小应用程序,它由另一个应用程序调用以从Internet检索数据。它作为一个独立的进程运行,但几乎所有与它的交互都由调用应用程序管理。因此它没有GUI。不过,我想添加一个使用WPF的进度条,在某些数据检索过程中显示,可能需要一分钟。估计完成了多少工作以及剩下多少工作很容易,因此我找到了适合的进度条。来自主线程的WPF窗口中的调用方法
研究做
我有螺纹的公平理解阅读阿尔巴哈利的PDF的大部分穿线(http://www.albahari.info/threading/threading.pdf)之后。我在这个问题上也通过了SO和MSDN上的很多帖子。大多数帖子都建议使用后台工作人员进行耗时的数据检索,同时将GUI保留在主线程中,因此可以使用后台工作人员提出解决方案。然而,在这种情况下,这感觉很尴尬,主要任务是数据检索而不是GUI交互。
我花了大量的时间尝试理解不同的教程和论坛帖子,同时尝试使它们符合我的问题,但我没有成功,现在我已经回到了原点。基本上我想有以下所列出的两个类来结束:
ProgressBarWindow
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#的代码并创建适当的属性。 –
采取点!我通常尝试。 – Anders