读书人

C# 排序 匿名函数解决方案

发布时间: 2013-08-04 18:26:16 作者: rapoo

C# 排序 匿名函数
之前看别人的博客看到这个排序方法,就拿来试了下,
因为要给线程传递参数我先用了ParameterizedThreadStart传参数
结果是正确的。
后来我改用匿名函数,就不用特意为传参数单独写个结构或者类了,
但是问题是,现在我传进去一个整数数组,老报错说IndexOutOfRangeException
但是调试执行却没有错,不过结果不是我想要的。
为什么i的值会是9呢,我明明让i<sortThread.Length.
希望帮忙解答以下,谢谢。
以下是代码:

private void DoSort()
{
int[] ints = { 1, 4, 7, 3, 8, 9, 2, 6, 5 };

Thread[] sortThreads = new Thread[ints.Length];
for (int i = 0; i < sortThreads.Length; i++)
{
//sortThreads[i] = new Thread(new ParameterizedThreadStart(run));
//sortThreads[i].Start(ints[i]);
sortThreads[i] = new Thread(new ThreadStart(delegate { run(ints[i]); }));
sortThreads[i].Start();

}
}


private void run(int ms)
{
try
{
Thread.Sleep(ms * 1000 + 10);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

Console.WriteLine(ms);
}
C# 线程
[解决办法]

sortThreads[i] = new Thread(new ThreadStart(delegate { run(ints[i]); })); 



你要明白这里的i, ints[i]甚至是run(ints[i]),对于delegate (应该是void () target)来说,其实是一个外部变量,而并不是调用delegate时的传入参数。
这里的run(ints[i]),i的值是在执行这一句的时候确定的,你可以把for (int i = 0; i < sortThreads.Length; i++) 改成 i < 8试一下。虽然肯定不会报错,但是你会发现,运行时有可能会有重复的输出。
再说i=9的问题,是因为for (int i = 0; i < sortThreads.Length; i++)这里执行到了i=8之后的i++,虽然这时候对于for循环来说是不会继续了,但碰巧此时你的一些Thread正好运行到run(ints[i])这里,所以这时候i=9。
所以,总结一下,ParameterizedThreadStart,Start(object)和delegate() {},Start()并不是一个东西。

读书人网 >C#

热点推荐