Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#-为循环创建线程(参数超出范围异常)_C#_Multithreading - Fatal编程技术网

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());