我不知道如何准确地描述这个问题。让我们来看看我的代码。
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的异常。所以,我使用调试器来检查每个变量的值。
我发现的是:
threads.Add(new Thread(
行。如果它设置在sounds[myMT.Keys[key_indexer][i]].PlayLooping();
行,则即使在&#34;跳过&#34; 我猜问题是关于线程的,但不知道如何解决它。
感谢您的帮助!
答案 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());
免责声明 :我对您的其他逻辑问题不承担任何责任,这是出于纯粹的病态学术目的