c#-为循环创建线程(参数超出范围异常)
我不知道如何准确地描述这个问题。让我们看看我的代码c#-为循环创建线程(参数超出范围异常),c#,multithreading,C#,Multithreading,我不知道如何准确地描述这个问题。让我们看看我的代码 for (int i = 0; i < myMT.Keys[key_indexer].Count; i++) { threads.Add(new Thread( () => { sounds[myMT.Keys[key_indexer][i]].PlayLooping(); } )); threads[threads.Cou
for (int i = 0; i < myMT.Keys[key_indexer].Count; i++)
{
threads.Add(new Thread(
() =>
{
sounds[myMT.Keys[key_indexer][i]].PlayLooping();
}
));
threads[threads.Count - 1].Start();
}
在构造器中:
threads = new List<Thread>();
myMT = new MusicTransfer(bubblePanel);
threads=newlist();
myMT=新的音乐转换器(bubblePanel);
myMT中的变量Keys
的类型为List
。它使用与myMT和线程相同的方式初始化。想象一个矩阵,外部列表是行的列表,内部列表是每个单元格的列表
运行程序时,我将myMT.Keys[key\u indexer].Count设置为1。所以,通常,当我达到1时,for循环应该停止
但是,它在sounds[myMT.Keys[key\u indexer][i].PlayLooping()行抛出ArgumentOutOfRange异常。因此,我使用调试器检查每个变量的值
我发现的是:
如果我使用“逐步”检查,这意味着在新线程运行后时间消耗很大,因为当我达到1时,循环将停止,这是应该的方式
如果在触发断点后单击“继续”,则for循环在I等于1后仍在处理
断点应始终设置在线程的行上。添加(新线程(
。如果在声音[myMT.Keys[key\u indexer][i]]的行上设置断点。PlayLooping();
,即使在“跳过”之后也会触发异常
我猜问题是关于线程的,但我不知道如何解决它
谢谢你的帮助!你的帖子有很多地方不对劲,不过也许这会帮你一点忙
注意:让您的代码可读,相信我,它会创造奇迹
//线程列表
var threads=newlist();
//让我们停止索引一切,让我们自己变得容易
var someList=myMT.Keys[key_indexer];
for(var i=0;isomeSound.PlayLooping());
//将线程添加到列表中
线程。添加(线程);
}
//现在,让我们以一种良好有序的方式开始踏板
foreach(线程中的var线程)
{
thread.Start();
}
另一种处理任务的方法
var tasks = new List<Task>();
var someList = myMT.Keys[key_indexer];
for (var i = 0; i < someList.Count; i++)
{
var someSound = someList[1];
var task = new Task(() => someSound.PlayLooping());
tasks.Add(task);
task.Start();
}
Task.WaitAll(tasks.ToArray());
var tasks=newlist();
var someList=myMT.Keys[key_indexer];
for(var i=0;isomeSound.PlayLooping());
任务。添加(任务);
task.Start();
}
Task.WaitAll(tasks.ToArray());
免责声明:我对你的其他逻辑问题不承担任何责任,这纯粹是出于病态的学术目的请更新你的问题,说明线程
是如何声明和初始化的。另外,请用所有读/写/分配/更改线程的代码更新你的帖子
。对也要这样做de>myMT
及其键
属性。调试它,检查您的值当线程集合计数
返回0时,您可能会得到参数超出范围异常
。您可以使用.Start()
就在tread创建之后。如果您能为我们提供一个用于重新编程的变量,那就太棒了。请始终记住将您的值框起来。使用var类型而不是特定类型创建变量有什么好处?如果是关于“装箱”,我正在阅读@m.rogalski提供给我的页面。谢谢你的帮助!我只是一名学习编码的学生。@jiecewei类型是隐式的,即编译器知道它是什么,你也知道,所以为什么不让代码可读谢谢你的帮助!我用任务列表更改了我的线程列表,效果很好(虽然我仍然不知道线程有什么问题)。我同意你的编码格式,它更具可读性
// List of threads
var threads = new List<Thread>();
// Lets stop indexing everything and make it easy for ourselves
var someList = myMT.Keys[key_indexer];
for (var i = 0; i < someList.Count; i++)
{
// we need to create a reference to the indexed value
// in the someList, otherwise there is no gaurentee
// the thread will have the right index when it needs it
// (thank me later)
var someSound = someList[i];
// create a thread and your callback
var thread = new Thread(() => someSound.PlayLooping());
// add thread to the list
threads.Add(thread);
}
// now lets start the treads in a nice orderly fashion
foreach (var thread in threads)
{
thread.Start();
}
var tasks = new List<Task>();
var someList = myMT.Keys[key_indexer];
for (var i = 0; i < someList.Count; i++)
{
var someSound = someList[1];
var task = new Task(() => someSound.PlayLooping());
tasks.Add(task);
task.Start();
}
Task.WaitAll(tasks.ToArray());