WEB开发网
开发学院图形图像Flash Silverlight(26) - 2.0线程之Lock, Interlocked, ... 阅读

Silverlight(26) - 2.0线程之Lock, Interlocked, EventWaitHandle, Monitor, ThreadStaticAttribute

 2008-12-31 11:53:44 来源:WEB开发网   
核心提示: 3、EventWaitHandle.xaml<UserControl x:Class="Silverlight20.Thread.EventWaitHandle"xmlns="http://schemas.microsoft.com/winfx/2006

3、EventWaitHandle.xaml

<UserControl x:Class="Silverlight20.Thread.EventWaitHandle"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <StackPanel HorizontalAlignment="Left" Margin="5">
    <TextBlock x:Name="txtAutoResetEvent" />
    <TextBlock x:Name="txtManualResetEvent" />
  </StackPanel>
</UserControl>

EventWaitHandle.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace Silverlight20.Thread
{
  public partial class EventWaitHandle : UserControl
  {
    // AutoResetEvent(bool state) - 通知其他线程是否可入的类,自动 Reset()
    //   bool state - 是否为终止状态,即是否禁止其他线程入内
    private System.Threading.AutoResetEvent autoResetEvent =
      new System.Threading.AutoResetEvent(false);
    // ManualResetEvent(bool state) - 通知其他线程是否可入的类,手动 Reset()
    //   bool state - 是否为终止状态,即是否禁止其他线程入内
    private System.Threading.ManualResetEvent manualResetEvent =
      new System.Threading.ManualResetEvent(false);
    private static int i;
    public EventWaitHandle()
    {
      InitializeComponent();
      // 演示 AutoResetEvent
      AutoResetEventDemo();
      // 演示 ManualResetEvent
      ManualResetEventDemo();
    }
    private void AutoResetEventDemo()
    {
      i = 0;
      for (int x = 0; x < 100; x++)
      {
        // 开 100 个线程去操作静态变量 i
        System.Threading.Thread thread =
          new System.Threading.Thread(new System.Threading.ThreadStart(AutoResetEventDemoCallback));
        thread.Start();
        // 阻塞当前线程,直到 AutoResetEvent 发出 Set() 信号
        autoResetEvent.WaitOne();
      }
      System.Threading.Thread.Sleep(1000);
      // 1 秒后 100 个线程都应该执行完毕了,取得 i 的结果
      txtAutoResetEvent.Text = i.ToString();
    }
    private void AutoResetEventDemoCallback()
    {
      try
      {
        int j = i + 1;
        // 模拟多线程并发操作静态变量 i 的情况
        System.Threading.Thread.Sleep(5);
        i = j;
      }
      finally
      {
        // 发出 Set() 信号,以释放 AutoResetEvent 所阻塞的线程
        autoResetEvent.Set();
      }
    }
    private void ManualResetEventDemo()
    {
      i = 0;
      for (int x = 0; x < 100; x++)
      {
        // Reset() - 将 ManualResetEvent 变为非终止状态,即由此线程控制 ManualResetEvent,
        //   其他线程排队,直到 ManualResetEvent 发出 Set() 信号(AutoResetEvent 在 Set() 时会自动 Reset())
        manualResetEvent.Reset();
        // 开 100 个线程去操作静态变量 i
        System.Threading.Thread thread =
          new System.Threading.Thread(new System.Threading.ThreadStart(ManualResetEventDemoCallback));
        thread.Start();
        // 阻塞当前线程,直到 ManualResetEvent 发出 Set() 信号
        manualResetEvent.WaitOne();
      }
      System.Threading.Thread.Sleep(1000);
      // 1 秒后 100 个线程都应该执行完毕了,取得 i 的结果
      txtManualResetEvent.Text = i.ToString();
    }
    private void ManualResetEventDemoCallback()
    {
      try
      {
        int j = i + 1;
        // 模拟多线程并发操作静态变量 i 的情况
        System.Threading.Thread.Sleep(5);
        i = j;
      }
      finally
      {
        // 发出 Set() 信号,以释放 ManualResetEvent 所阻塞的线程,同时 ManualResetEvent 变为终止状态)
        manualResetEvent.Set();
      }
    }
  }
}

上一页  1 2 3 4 5  下一页

Tags:Silverlight 线程 Lock

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接