技术开发 频道

Silverlight 4中五种多线程编程技巧

       txtMsg.Text = result;

  }

  void DoWork(
object sleepMillisecond)

  {

  System.Threading.Thread.Sleep((
int)sleepMillisecond);

  result
+= "The thread terminated!\r\n";

  }

  正如上面你所看到的,要使用Thread类,要几点需要注意:

  第一,我们应该首先创建一个新的Thread对象。在上面的例子中,我们提供一个委托来指向要异步调用的方法。在这种情况下,DoWork是由一个后台线程(这里的委托类型省略)执行的方法。注意,ThreadStart委托不能带参数,而ParameterizedThreadStart委托可以带参数。后面的例子将展示相关的使用。

  第二,IsBackground属性指示这是否是一个后台线程(注意,在Silverlight中并没有区分是否是一个后台线程)。接下来,Start方法用于启动线程,传递一个整数来指定睡眠时间(毫秒)。请注意,Start方法立即返回,并且相关的代码开始在新线程上异步执行。事实上,我们甚至可以将任何对象传递给Start的方法。

  有关Start方法,请参考以下定义:

  清单2:

public void Start(

  
Object parameter

  );

public void Start(

  
Object parameter

  );

  还要注意的是,另外一个方法Join是用来阻止调用者线程(在上面的情况下,即指主线程),直到指定的线程(在上面的情况下,即指线程thread)已完成。如果指定的线程完成,则继续执行后面的语句;如果指定的线程运行比指定的时间长,还要继续进行。返回值的意义在于指定,在指定的时间内,是否完成指定的线程执行。

  现在,让我们来思考下面的十分有趣的事情:

  清单3:

void DoWork(object sleepMillisecond)

  {

  button1.Content
= "Hello world!";

  
//省略其他内容……

  }

  执行上面的代码将会失败—系统将会抛出一个运行时刻UnauthorizedAccessException警告“无效的跨线程访问”。这表明,系统不允许线程访问Silverlight对象。这其实提出了一个多线程环境下的典型问题。为了解决这个问题,通常建议借助于使用System.Windows.Threading.Dispatcher对象。下一节正要探讨这个对象。

  2.使用System.Windows.Threading.Dispatcher

  在正式讨论System.Windows.Threading.Dispatcher对象之前,让我们先看看如何解决上述问题。

0
相关文章