我有一个应用程序,它在第一次启动时每 7 天执行一次更新,从网上下载一些文件。
此更新最多可能需要 5 分钟,具体取决于需要下载的文件数量。
我想做的是在一个单独的线程中运行更新,以便在更新处理时 GUI 的其余部分可用。
对于我的应用程序来说,这似乎是一个非常可行的选择,但我还想在主 GUI 中显示一条消息,可能在状态栏中,告诉用户更新正在处理,并在完成后消失。
我已经四处寻找方法来做到这一点,但似乎没有任何作为我正在寻找的解决方案弹出。有谁知道这是否可能以及如何做到这一点?
我有一个应用程序,它在第一次启动时每 7 天执行一次更新,从网上下载一些文件。
此更新最多可能需要 5 分钟,具体取决于需要下载的文件数量。
我想做的是在一个单独的线程中运行更新,以便在更新处理时 GUI 的其余部分可用。
对于我的应用程序来说,这似乎是一个非常可行的选择,但我还想在主 GUI 中显示一条消息,可能在状态栏中,告诉用户更新正在处理,并在完成后消失。
我已经四处寻找方法来做到这一点,但似乎没有任何作为我正在寻找的解决方案弹出。有谁知道这是否可能以及如何做到这一点?
您需要做的就是使用Dispatcher.Invoke
来自后台线程的调用来包装您的 UI 访问代码。要使用的Dispatcher
实例可以通过Dispatcher
您的UIElement
.
假设下面的方法是在你的 UI 元素的类定义中定义的:
private void ProcessItems(IList<Item> items)
{
Task.Factory.StartNew(() =>
{
for (int i = 0; i < items.Count; ++i)
{
// Code here runs on background thread.
this.ProcessItem(items[i]);
this.Dispatcher.Invoke(DispatcherPriority.Normal, () =>
{
// Code here runs on UI thread.
this.UpdateStatus("Completed " + (i + 1) + " of " + items.Count);
});
}
},
TaskCreationOptions.LongRunning);
}
有了这个小家伙:
internal static class ControlExtensions
{
internal static void Invoke(this Control control, Action action)
{
control.Invoke(action);
}
}
你可以调用你的代码(在win form world中,wpf有自己的解决方案):
... form.Invoke(()=>form.SomeControl.SomeProperty=someValue);