Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程化事件处理_C#_Multithreading_Events - Fatal编程技术网

C# 线程化事件处理

C# 线程化事件处理,c#,multithreading,events,C#,Multithreading,Events,重要的是让线程t从1打印到某个值,然后根据另一个线程s执行的信号ManualResetEvent暂停执行。完成s后,设置信号。因此,T恢复其执行 class A { int key; int temp; public A(int x) { key = x; } public EventHandler eventHandler; private void onKeyReached(object sender, EventArg

重要的是让线程t从1打印到某个值,然后根据另一个线程s执行的信号ManualResetEvent暂停执行。完成s后,设置信号。因此,T恢复其执行

class A
{
    int key;
    int temp;
    public A(int x)
    {
        key = x;
    }
    public EventHandler eventHandler;
    private void onKeyReached(object sender, EventArgs e)
    {
        eventHandler(this, e);
    }
    public int Temp
    {
        get { return temp; }
        set
        {
            if (value == temp) return;
            else if (temp == key)
                onKeyReached(this, EventArgs.Empty);
            else
                temp = value;
        }
    }
}
class Test
{
    static A a = new A(500);

    //signal to pause or resume threads
    static ManualResetEvent signal = new ManualResetEvent(true);

    static void Main()
    {
        a.eventHandler += WorkOnKeyReached;

        Thread t = new Thread(F);
        t.Start();
    }
    static void F()
    {
        for (int i = 0; i < 1000; i++)
        {
            a.Temp = i;
            //when a.Temp == a.Key, a.OnkeyReached() is fired.
            signal.WaitOne();
            Console.WriteLine(a.Temp);
        }
    }
    static void WorkOnKeyReached(object sender, EventArgs e)
    {
        signal.Reset();
        Thread s = new Thread(() =>
        {
            Console.WriteLine("Doing something else...");
            Thread.Sleep(3000);
            Console.WriteLine("Done..");
            signal.Set();
        });
        s.Start();
    }
}
有人能解释这种现象吗?我只是在玩线程和其他东西

    public int Temp
{
    get { return temp; }
    set
    {
        if (value == temp) return;
        else if (temp == key)
            onKeyReached(this, EventArgs.Empty);
       //else
            temp = value;
    }
}

基本上去掉else,否则它的增量永远不会超过500

我现在可以告诉你,针对A类的临时设置程序不是线程安全的为什么A.Temp=I不安全?我知道只有一个线程执行该行。
    public int Temp
{
    get { return temp; }
    set
    {
        if (value == temp) return;
        else if (temp == key)
            onKeyReached(this, EventArgs.Empty);
       //else
            temp = value;
    }
}