Kir*_*ril 3 c# lambda multithreading for-loop exception
我得到了一些奇怪的行为...当我dummyText
List
在ThreadTest
方法中迭代时,我得到一个超出范围异常(ArgumentOutOfRangeException
)的索引,但如果我删除线程并且我只打印出文本,那么一切正常.
这是我的主要方法:
public static Object sync = new Object();
static void Main(string[] args)
{
ThreadTest();
Console.WriteLine("Press any key to continue.");
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
此方法抛出异常:
private static void ThreadTest()
{
Console.WriteLine("Running ThreadTest");
Console.WriteLine("Running ThreadTest");
List<String> dummyText = new List<string>()
{ "One", "Two", "Three", "Four", "Five",
"Six", "Seven", "Eight", "Nine", "Ten"};
for (int i = 0; i < dummyText.Count; i++)
{
Thread t = new Thread(() => PrintThreadName(dummyText[i])); // <-- Index out of range?!?
t.Name = ("Thread " + (i));
t.IsBackground = true;
t.Start();
}
}
private static void PrintThreadName(String text)
{
Random rand = new Random(DateTime.Now.Millisecond);
while (true)
{
lock (sync)
{
Console.WriteLine(Thread.CurrentThread.Name + " running " + text);
Thread.Sleep(1000+rand.Next(0,2000));
}
}
}
Run Code Online (Sandbox Code Playgroud)
这不会抛出异常:
private static void ThreadTest()
{
Console.WriteLine("Running ThreadTest");
List<String> dummyText = new List<string>()
{ "One", "Two", "Three", "Four", "Five",
"Six", "Seven", "Eight", "Nine", "Ten"};
for (int i = 0; i < dummyText.Count; i++)
{
Console.WriteLine(dummyText[i]); // <-- No exception here
}
}
Run Code Online (Sandbox Code Playgroud)
有人知道为什么会这样吗?
Aar*_*ght 13
将局部变量传递给线程或ThreadPool
通过闭包委托时,需要复制变量.如:
for (int i = 0; i < dummyText.Count; i++)
{
int index = i;
Thread t = new Thread(() => PrintThreadName(dummyText[index]));
// ...
}
Run Code Online (Sandbox Code Playgroud)
如果你不这样做,那么变量基本上是通过引用传入的,并且索引将超过for
循环末尾的数组边界(这可能在执行闭包之前很久就会发生).
归档时间: |
|
查看次数: |
2820 次 |
最近记录: |