当后台线程工作时,进度条(微调器)不动画

时间:2013-12-19 07:59:05

标签: c# .net wpf multithreading

我有一个背景工作者做一些工作。我想在主控件上有一个微调器,表明应用程序正在运行。但看起来线程正在阻止我的微调器动画(有时它甚至不显示)...可以解释为什么它不工作(可能因为睡眠线程)并且可能引导我找到一个代码更改最少的解决方案:)< / p>

最好的问候,no9。

public void StartProcess(object obj)
{

  this.eventAggregator.GetEvent<ActionEvent>().Publish(new Message(EMessageType.Info)
  {
    Title = "Start",
    Description = "Starting action..."
  });

  Worker = new BackgroundWorker();
  Worker.DoWork += new DoWorkEventHandler(worker_DoWork);
  Worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);

  try
  {
    this.Document = null;
    Dictionary<string, Stream> tmp = this.GetContent();
    //start and show the spinner
    this.View.ShowDocumentProgressSpinner(true);
    Worker.RunWorkerAsync(tmp);
  }

  catch (Exception ex)
  {
    ExceptionPolicy.HandleException(ex, "LogAndSwallow");
    this.eventAggregator.GetEvent<ActionEvent>().Publish(new Message(EMessageType.Error)
     {
       Title = "Error",
       Description = "There was an error processing your action."
     });
  }
  finally
  {
    this.View.ShowActionButton(false);
  }
}


private void worker_DoWork(object sender, DoWorkEventArgs e)
{
  var logger = new ActionLoggerAndViewUpdater(this.eventAggregator, this.View);
  foreach (KeyValuePair<string, Stream> pair in (Dictionary<string, Stream>)e.Argument)
  {
    using (Stream stream = pair.Value)
    {
        //setting the document fires login event that changes stuff on presenter (current class instance)
        this.Document = new Document(stream);

        //check if ok to continue
        while (!this.IsLoggedInForTheWorkingDocument)
        //wait of the login stuff to complete
        Thread.Sleep(2000);

      System.Windows.Application.Current.Dispatcher.Invoke((Action)(() =>
      {
        //this depends on the login and takes some time to process
        this.DoSomeStuff();
      }));
    }
  }
}

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  //stop and hide the spinner
  this.View.ShowDocumentProgressSpinner(false);
  ...
}

2 个答案:

答案 0 :(得分:2)

为什么要在后台工作人员上调用某些内容?后台工作者的整个目的是在UI线程中运行并阻止它。不要从工人那里调用长时间运行的过程,这会破坏它的目的。

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
  var logger = new ActionLoggerAndViewUpdater(this.eventAggregator, this.View);
  foreach (KeyValuePair<string, Stream> pair in (Dictionary<string, Stream>)e.Argument)
  {
    using (Stream stream = pair.Value)
    {
        this.Document = new Document(stream);

        // this should REALLY be handled by an event, not busy waiting:
        while (!this.IsLoggedInForTheWorkingDocument) 
        //wait of the login stuff to complete
            Thread.Sleep(2000);

        // removed the invoking, this is supposed to run in the background, right?
        this.DoSomeStuff();
    }
  }
}

答案 1 :(得分:0)

因为您的工作程序在另一个线程中运行,所以它无法在进程中更新UI线程,因此行为也是如此。请参阅此其他类似问题Updating GUI (WPF) using a different thread

基本上你需要调用control.Dispatcher.Invoke来让你的UI从另一个线程更新