【问题标题】:Event Handling with Threading使用线程处理事件
【发布时间】:2016-02-07 01:29:36
【问题描述】:

大局是让Thread t1 打印到某个值,然后根据signal (ManualResetEvent) 暂停执行,在此期间另一个线程s 执行。在s 完成后,它是sets the signal。因此,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();
    }
}

程序在前半部分按预期工作,直到线程 tsignalWorkOnKeyReached 中成为 reset 时暂停。 然而在WorkOnKeyReached 完成后,我set signal 希望t 继续。

输出:

1
2
..
500
Doing something else...
Done.
500
Doing something else...
Done.

谁能帮助解释这种现象?我只是在玩线程和其他东西。

【问题讨论】:

  • 我现在可以告诉你,针对 A 类的 Temp setter 不是线程安全的
  • 为什么a.Temp = i 不安全?我知道只有 1 个线程执行该行。

标签: c# multithreading events


【解决方案1】:
    public int Temp
{
    get { return temp; }
    set
    {
        if (value == temp) return;
        else if (temp == key)
            onKeyReached(this, EventArgs.Empty);
       //else
            temp = value;
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2012-10-03
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多