代码之家  ›  专栏  ›  技术社区  ›  Larry OBrien

Dispatcher.BeginInvoke lambda捕获线程安全?

  •  2
  • Larry OBrien  · 技术社区  · 14 年前

    在WindowsPhone7/Silverlight中,以下代码是安全的还是竞争条件?

    //Snippet 1
    foreach(var item in list)
    {
       Deployment.Current.Dispatcher.BeginInvoke( () => { foo(item); });
    }
    

    当然(?)这个选择很有活力?

    //Snippet 2
    Deployment.Current.Dispatcher.BeginInvoke( () => 
       { 
           foreach(var item in list){ foo(item); }
       });
    list.Clear();
    
    1 回复  |  直到 14 年前
        1
  •  6
  •   Philip Rieck    14 年前

    最后一项 foo 对所有项调用方法。

    相反,请执行以下操作:

    foreach(var item in list)
    {
       var tmpItem = item;
       Deployment.Current.Dispatcher.BeginInvoke( () => foo(tmpItem));
    }
    

    这将一个变量放在一个较低的作用域中,并在该作用域中捕获它。这确保了 每个 .

    考虑到 list 变量。