按照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(); } |
|
20分 |
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))); } // ... } } |
一个方法要返回值,就可以使用函数返回值规范。而如果其处理实际上可能异步执行,那么就用异步回调方式来返回。 如果不想把大家都搞“死得很难看”,就稍微遵循一点规范。不要瞎写什么 ref。 |
|
20分 |
从你堆砌太多的问题代码来看,线程会让你给弄成累赘的。你需要学点简单化、傻瓜化的程序规范。
一个异步(不能保证被同步调用)的方法,它有东西要输出,它要使用委托回调来通知它要输出的结果,例如定义为 public void Calc(int input, Action<int> callback) 这样设计接口! |
我再给你纠正一个、可能是你的老师误导了你的说法,方法
void Calc(ref int x) { x = 3; } void test() { value = 0; Calc(ref value); Debug.Assert(value == 3); } 这能说“方法 Calc 内部把外部变量value给改为3”了吗?如果你老是那样教你,就是非常明显在瞎说了!没有一个正规的说明敢说“ref的意思就是方法内部去修改方法外部的变量值”。如果是你自己瞎猜的,那么情有可原,实际情况完全不是这么回事。ref 的意思是说 Calc 执行结束之后会把结果赋值给 value,而绝不是说 Calc 内部会去修改外部变量 value。 高级语言不胡乱解释什么参数上的 ref 的作用,去掉了c语言的胡乱之源。这是各种高级语言跟 c 的重要区别。 |
|
感谢。我确实把ref理解成C里面的指针了,以为ref就是传了个指针过去,直接操作原来的内存位置呢。 |
|
我确实没有足够经验,写的东西不规范,诚恳向专家请教。您说的这个道理我明白,但实际过程中是很复杂的。 |