问候,我试图在不占用GUI的情况下播放一些音频文件。以下是代码示例:
if (audio)
{
if (ThreadPool.QueueUserWorkItem(new WaitCallback(CoordinateProc), fireResult))
{
}
else
{
MessageBox.Show("false");
}
}
if (audio)
{
if (ThreadPool.QueueUserWorkItem(new WaitCallback(FireProc), fireResult))
{
}
else
{
MessageBox.Show("false");
}
}
if (audio)
{
if (ThreadPool.QueueUserWorkItem(new WaitCallback(HitProc), fireResult))
{
}
else
{
MessageBox.Show("false");
}
}
情况是样品没有按顺序播放。有些人在另一个之前玩,我需要解决这个问题,以便按顺序依次播放样本。
我该如何实现?
谢谢。
编辑:ThreadPool.QueueUserWorkItem(new WaitCallback(FireAttackProc), fireResult);
我已将所有声音片段放在FireAttackProc中。这不做什么,我想要的是:等到线程停止运行,然后开始一个新线程,这样样本不会重叠。
答案 0 :(得分:3)
为什么不创建一个“WorkItem”并在那里做所有事情?
答案 1 :(得分:1)
您无法保证线程池线程的执行顺序。而不是像其他人所建议的那样,使用单个线程按顺序运行过程。将音频过程添加到队列中,运行单个线程,按顺序将每个过程拉出队列并调用它们。每次将proc添加到队列时,都使用事件等待句柄来通知线程。
一个例子(这并没有完全实现Dispose模式......但是你明白了):
public class ConcurrentAudio : IDisposable
{
public ConcurrentAudio()
{
_queue = new ConcurrentQueue<WaitCallback>();
_waitHandle = new AutoResetEvent(false);
_disposed = false;
_thread = new Thread(RunAudioProcs);
_thread.IsBackground = true;
_thread.Name = "run-audio";
_thread.Start(null); // pass whatever "state" you need
}
public void AddAudio(WaitCallback proc)
{
_queue.Enqueue(proc);
_waitHandle.Set();
}
public void Dispose()
{
_disposed = true;
_thread.Join(1000); // don't feel like waiting forever
GC.SuppressFinalize(this);
}
private void RunAudioProcs(object state)
{
while (!_disposed)
{
try
{
WaitCallback proc = null;
if (_queue.TryDequeue(out proc))
proc(state);
else
_waitHandle.WaitOne();
}
catch (Exception x)
{
// Do something about the error...
Trace.WriteLine(string.Format("Error: {0}", x.Message), "error");
}
}
}
private ConcurrentQueue<WaitCallback> _queue;
private EventWaitHandle _waitHandle;
private bool _disposed;
private Thread _thread;
}
答案 2 :(得分:0)
您应该查看BackgroundWorker选项!