Flash:Silverlight中跨线程访问的问题

来源:软件水平考试    发布时间:2012-11-05    软件水平考试视频    评论

  在silverlight中跨线程访问,不像在winform里有controls.invoke
  在里面一般的情况下使用的是Dispather.BeginInvoke
  但是本人还发现,用AsyncOperator或者AsynchronazationContext也可以实现上下文的转换
  代码如下
  Page.xaml
  <UserControl x:Class="SilverlightChat.Page"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Width="400" Height="300">
  <Grid x:Name="LayoutRoot" Background="White">
  <Grid.RowDefinitions>
  <RowDefinition Height="80" />
  <RowDefinition Height="80" />
  </Grid.RowDefinitions>
  <TextBlock x:Name="tblTest" Text="not loaded yet" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Row="0" />
  <Button x:Name="btnTest" Content="ClickMe" Height="30" Width="50" Click="btnTest_Click" Grid.Row="1" />
  </Grid>
  </UserControl>
  Page.xaml.cs
  using System.Windows.Controls;
  using System.Threading;
  using System.ComponentModel;
  namespace SilverlightChat
  {
  public partial class Page : UserControl
  {
  //private SynchronizationContext currentContext;
  private AsyncOperation asyncOper;
  public Page()
  {
  InitializeComponent();
  asyncOper = AsyncOperationManager.CreateOperation(null);
  //this.currentContext = SynchronizationContext.Current;
  }
  private void btnTest_Click(object sender, System.Windows.RoutedEventArgs e)
  {
  Thread t = new Thread(new ThreadStart(AcrossThread));
  t.Start();
  }
  private void AcrossThread()
  {
  asyncOper.Post(result =>
  {
  tblTest.Text = "HasChanged";
  }, null);
  //currentContext.Post(result =>
  //{
  //  tblTest.Text = "HasChanged";
  //}, null);
  }
  }
  }
  从而达到跨线程访问UI的目的.

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答