c# - 在for循环中创建线程(争论超出范围异常)

时间:2018-02-07 10:29:01

标签: 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.Count - 1].Start();
}

注意:声音是SoundPlayers的列表

初始化threads and myMT

List<Thread> threads = null;
MusicTransfer myMT=null;

并在构造函数中:

threads = new List<Thread>();
myMT = new MusicTransfer(bubblePanel);

myMT中的变量Keys的类型为List<List<int>>。它以myMT和线程的相同方式初始化。想象一下矩阵,外部列表是行列表,内部列表是每个单元格。

当我运行程序时,我将myMT.Keys[key_indexer].Count设置为1.因此,通常情况下,当我达到1时,for循环应该停止。

但是,它会在sounds[myMT.Keys[key_indexer][i]].PlayLooping()行引发ArgumentOutOfRange的异常。所以,我使用调试器来检查每个变量的值。

我发现的是:

  1. 如果我使用&#34;跳过&#34;逐步检查,这意味着在新线程运行后,时间消耗很多,因为当我达到1时,循环将停止,这就是应该的方式。
  2. 如果我点击&#34;继续&#34;在触发断点之后,在i等于1之后,for循环仍在处理。
  3. 断点应始终设置在threads.Add(new Thread(行。如果它设置在sounds[myMT.Keys[key_indexer][i]].PlayLooping();行,则即使在&#34;跳过&#34;
  4. 之后也会触发异常

    我猜问题是关于线程的,但不知道如何解决它。

    感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

你的帖子有很多问题,不过这可能对你有所帮助

注意 :让您的代码可读,相信我有奇迹

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

免责声明 :我对您的其他逻辑问题不承担任何责任,这是出于纯粹的病态学术目的