2017-02-04 59 views
1

我有一个包含项目的列表框,用户可以对项目执行某些操作,例如新建/编辑/删除。但是,这可能需要一些时间,并且我希望在执行基础操作时显示不确定的进度条。耗时的工作和进度条

我应该如何处理.NET 4.6 & C#6.0? 根据this post我应该使用基于任务的异步模式(TAP)。在线程中有许多可能的解决方案。

这仍然是首选方法吗?

回答

1

这里首先要了解的是,你应该执行新/编辑/删除操作一个后台线程,以保持您的UI响应,并使ProgressBar能够在这些操作完成所需的时间内进行更新。

将某些工作转移到后台线程的首选和最简单的方法是使用任务并行库(TPL)并开始一个新任务。请记住,WPF控件具有线程关联性,因此只能在它们最初创建的线程上访问它们,并且它是调度程序线程。

所以,你可以通过设置ProgressBarVisibleVisibility属性实现这一点,开始执行实际新建/编辑/删除操作的任务,然后设置Visibility属性回Collapsed再次,一旦任务完成:

C#:

pb.Visibility = Visibility.Visible; 
Task.Run(()=> 
{ 
    //perform your long-running operation here...make sure that you don't access any UI elements 
    Save(); 
}) 
.ContinueWith(task => 
{ 
    //this delegate will be executed back on the UI thread once the task has finished because of the scheduler returned from the TaskScheduler.FromCurrentSynchronizationContext() method... 
    pb.Visibility = Visibility.Collapsed; 
}, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); 

XAML:

<ProgressBar x:Name="pb" IsIndeterminate="True" Visibility="Collapsed" /> 
+0

上面给出的C#通常位于xaml.cs文件中吗?我在ViewModel中具有新建/编辑/删除功能,并通过命令“访问”。我对WPF和MVVM非常陌生,我只是试图找到最好的做法,但我并不是很擅长。此外,例如删除,我从列表框(显然是一个UI元素),也从解决方案资源管理器(我忙于一个VS包扩展)删除项目,这最后一个需要几秒钟。所以我不确定我不应该像你说的那样访问一个UI元素? – Igavshne

+0

应该在视图模型中实现新建/编辑/删除功能。不是直接设置ProgressBar的Visibility属性,而是设置绑定到ProgressBar的源属性的值。我猜你的操作实际上执行了一些可能需要一些时间的工作,例如与数据库或服务层进行通信。如果你只是想从列表框中删除一个项目,或者更确切地说是绑定到列表框的ObservableCollection,你根本不需要ProgressBar。 – mm8

+0

啊,是的,当然,我可以设置绑定到ProgressBar的源属性的值。是的,我确实与一个数据库进行了沟通。谢谢,我会尝试你的答案,然后回来。 – Igavshne

0

在C#中,您可以使用工具箱中的progressBar工具显示不确定的时间。

为了使用progressBar只需将它拖放到窗体上。

现在要解决主要问题,您需要显示一个不确定的时间。 要显示在进度条的进度,则使用定时器和以下代码:

int value = 0; 
private void timer1_Tick(object sender, EventArgs e) 
    { 
     if (value < 100)//value at 100 can be any large integer since indeterminant time 
     { 
      value++; 
      progressBar1.Value = value; 
     } 

    } 

组timer1.Interval = 100;

变量值是您为progressBar设置的最大值。

由于您不知道时间,因此将progressBar的最大值设置为10000或其他任何大值。 现在启用计时器,当你输入你的功能(说新/编辑/删除),并禁用计时器,当你退出你的功能

+0

我不立这个解决方案。你只是“欺骗”进度栏的值。相反,可以使用@ mm8答案中指出的进度条的Indeterminate属性。 –

+0

它可能是作弊,但会起作用。现在最主要的是,你没有告诉用户应用程序完成这些任务需要多少时间,因此不确定的时间。所以根据我的说法,当任务由应用程序完成时,您不需要显示100%的进度条。 –

+0

我不认为这是很好的编程习惯。无论谁要在我之后维护代码,肯定都会浪费时间来弄清楚发生了什么。 – Igavshne