当前位置: 代码迷 >> C# >> WaitCallback怎么传递ref参数
  详细解决方案

WaitCallback怎么传递ref参数

热度:346   发布时间:2016-05-05 05:04:41.0
WaitCallback如何传递ref参数
按照MSDN推荐,线程中如果要传递参数并返回值,可把处理函数及数据封装进类里。
如果要在线程里改变某个主线程变量的值怎么办?
我感觉函数已经封装进类了,没法直接用主线程的全局变量,那就必须使用引用类型把变量传进类里。可这个类如何构造我就不明白了。

我的程序:

        class MyProc
        {
            public void Calc(ref int count)
            {
                Interlocked.Increment(ref count);
                Thread.Sleep(100);
            }
        }
        class testref
        {
            private int count;
            public testref()
            {
                count = 0;
            }
            public void test()
            {
                for (int i = 0; i < 10; i++)
                {
                    Interlocked.Increment(ref count);
                    MyProc proc = new MyProc();
                    //就是不知道下一句里的第二个参数怎么构造才能从proc.Calc里引用count
                    ThreadPool.QueueUserWorkItem(new WaitCallback(proc.Calc), ref count);
                }
                MessageBox.Show("Count=" + count.ToString());
                Thread.Sleep(2000);
                MessageBox.Show("Count=" + count.ToString());
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            testref t = new testref();
            t.test();
        }

------解决思路----------------------
WaitCallback不能这样用。既然count是testref类的私有变量,那么不应该在其它类对它直接操作。可以改成下面这样:

class MyProc
{
    public void Calc(object state)
    {
        ((testref)state).IncreaseCount();
        Thread.Sleep(100);
    }
}

class testref
{
    private int count;
    
    public void test()
    {
        for (int i = 0; i < 10; i++)
        {
            IncreaseCount();
            MyProc proc = new MyProc();
            ThreadPool.QueueUserWorkItem(new WaitCallback(proc.Calc), this);
        }
        // ...
    }

    public void IncreaseCount()
    {
        Interlocked.Increment(ref count);
    }
}

或者:

class MyProc
{
    public void Calc(object state)
    {
        ((Action)state)();
        Thread.Sleep(100);
    }
}

class testref
{
    private int count;
    
    public void test()
    {
        for (int i = 0; i < 10; i++)
        {
            Interlocked.Increment(ref count);
            MyProc proc = new MyProc();
            ThreadPool.QueueUserWorkItem(new WaitCallback(proc.Calc), new Action(() => Interlocked.Increment(ref count)));
        }
        // ...
    }
}

------解决思路----------------------
从你堆砌太多的问题代码来看,线程会让你给弄成累赘的。你需要学点简单化、傻瓜化的程序规范。

一个异步(不能保证被同步调用)的方法,它有东西要输出,它要使用委托回调来通知它要输出的结果,例如定义为
public void Calc(int input, Action<int> callback)


这样设计接口!
  相关解决方案