事件处理程序同步

时间:2010-08-25 12:10:47

标签: c# multithreading silverlight

我有一个循环:

List<FrameworkElement> list;
public void Foo(object sender, PrintPageEventArgs e)
{
  foreach(FrameworkElement fe in list)
  {
    fe.LayoutUpdated += FeLayoutUpdated;
    fe.UpdateLayout();
  }
  if(counter >= lista.Count)
    e.PageVisual = objectFromClass. // was DoSth()
}
int counter = 0;
void FeLayoutUpdated(object sender, EventArgs e)
{
  counter++
}

所以我需要在Foo()被触发时以及当列表中的所有FrameworkElement对象都更新它的布局时才触发DoSth()。我试图使用一些Thread类和BackgroundWorker,但我无法达到预期的行为,这就是主线程正在等待fe.UpdateLayout完成他们的工作。我希望我明确提出主要想法。谢谢你的回复。

2 个答案:

答案 0 :(得分:1)

在事件处理程序(例如

)中的代码之后移动的快速解决方案
void FeLayoutUpdated(object sender, EventArgs e)
{
  counter++;
  if(counter >= lista.Count)
    DoSth();
}

答案 1 :(得分:1)

这有什么理由: -

public void Foo(List<FrameworkElement> list) 
{ 
  foreach(FrameworkElement fe in list) 
  { 
    fe.UpdateLayout(); 
  } 
  DoSth(); 
}

不适合你吗? (注意Foo应该在主UI线程上调用)。