技术开发 频道

Silverlight 4中四种多线程编程技术

  {

  InitializeComponent();

  
//UI线程

  _syncContext
= System.Threading.SynchronizationContext.Current;

  
//输出当前时间

  txtMsg.Text
= DateTime.Now.ToString() + "\r\n";

  _timer
= new System.Threading.Timer(MyTimerCallback, "helltimer", 3000, 1000);

  }

  
private void MyTimerCallback(object state)

  {

  
string result = string.Format("{0} - {1}: \r\n", DateTime.Now.ToString(), (string)state);

  _syncContext.Post(delegate { txtMsg.Text
+= result; }, null);

  _flag
++;

  
if (_flag == 5)

  _timer.Change(
5000, 500);

  
else if (_flag == 10)

  _timer.Dispose();

  }

  }

  }

  有以下几点值得注意。

  第一,明确传递给定时器的参数:方法MyTimerCallback表示在线程池中执行的方法。第二个参数(在本例中的字符串)代表了传递给方法MyTimerCallback的内容。第三个参数详细说明方法MyTimerCallback被调用之前迟延时间的长短,以毫秒为单位。第四个参数是调用MyTimerCallback方法的时间间隔的说明,以毫秒为单位。

  第二,我们已经使用了SynchronizationContext对象,因为线程上下文是清晰易知的。还要注意,在方法MyTimerCallback中我们调用了它的Post方法来修改UI线程中的内容。最后,通过定时器的Change方法,我们指定在该方法执行5次后,把开始时间设置为五分钟,计时器方法调用的时间间隔为5毫秒。

  3.使用DispatcherTimer

  DispatchTimer第一次亮相是在Silverlight(WPF)中作为一个后台线程计时器。与原System.Threading.Timer相比,不同之处在于DispatchTimer是真正的在后台线程中独立执行的,而定时器Timer仍然在UI线程中执行,每隔一个指定的时间接管UI线程的控制权。总体来看,DispatchTimer主要适合于调度任务的情况。在这种情况下,我们可以根据实际要求设置等待时间。请参考下面的示例。

  清单3:

  public partial class MainPage : UserControl

  {

  DispatcherTimer
timer;

  
public MainPage()

  {

  InitializeComponent();

  
timer = new DispatcherTimer();

  
timer.Tick += (s, e) => {

  
//每隔1000毫秒发生一次

  
//修改UI线程中的对象

  this.TextBlock1.Text
= DateTime.Now.ToString();

  };

  
timer.Interval = TimeSpan.FromMilliseconds(1000);

  
timer.Start();

  }

  }
0
相关文章