分享

autoEvent.WaitOne(1000,true)第二个参数啥作用啊,有高手知道吗?

 黄金屋1 2019-01-12
在大部分情况下那个参数是没有用的。

只有在使用ContextBoundObject来进行同步的时候,那个参数才有用。

1、Synchronization可以用来同步一个类(基于ContextBoundObject)。
比如以下的例子,同一时间只能运行一个方法A。把标志行1注释掉,则可观察到乱序执行。

2、WaitOne(...,true)使得方法B可以暂时脱离ContextBound同步保护,让A有机会在B等待的时候得到执行。比如以下的例子的结果为:
...
Start B
Start A
End   A
End   B 
把标志行2的true改成false,那么A就要等到B执行后才能执行。

C# code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 
34
using System;
using System.Threading;
[System.Runtime.Remoting.Contexts.Synchronization(true)]   // 1
class My : ContextBoundObject
{
    static void Main(string[] args)
    {
        My my = new My();
        ThreadPool.QueueUserWorkItem(my.FuncA);
        Thread.Sleep(50);
        ThreadPool.QueueUserWorkItem(my.FuncA);
        Thread.Sleep(50);
        ThreadPool.QueueUserWorkItem(my.FuncB);
        Thread.Sleep(50);
        ThreadPool.QueueUserWorkItem(my.FuncA);
        Console.ReadLine();
    }
    AutoResetEvent myEvent = new AutoResetEvent(false);
    public void FuncA(object state)
    {
        Console.WriteLine("Start A");
        System.Threading.Thread.Sleep(2000);
        Console.WriteLine("End   A");
    }
    public void FuncB(object state)
    {
        Console.WriteLine("Start B");
        myEvent.WaitOne(10 * 1000, true);                // 2
        Console.WriteLine("End   B");
    }
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多