gpt4 book ai didi

c# - 线程之间的线程通信

转载 作者:行者123 更新时间:2023-12-03 13:13:09 24 4
gpt4 key购买 nike

所以我有一个参数化的线程启动,它初始化了一些 NAudio 的东西......但我需要一个单独的线程告诉 NAudio 线程启动。当我尝试它时,它崩溃了。如何实现安全的跨线程通信?

这是线程(这个类成为主线程中的音频对象):

class Audio
{
public IWavePlayer OutDevice;
public WaveStream OutStream;

public Thread thread;

public Audio(string file)
{
this.thread = new Thread(new ParameterizedThreadStart(InitAudio)); thread.Start(file);
}

private void InitAudio(object data) {

this.OutDevice = new WaveOut();
this.OutStream = new WaveChannel32(new Mp3FileReader(data.ToString()));
this.OutDevice.Init(OutStream);
}
}

我需要能够让我的主线程调用 audio.OutDevice.Play();但我不能,因为它是跨线程的并且它崩溃了。我该怎么做?

最佳答案

您的音频播放正在使用硬件资源,并且通常情况下,必须在创建它们的同一线程上访问这些资源。在您的代码中,您没有留下继续访问线程的空间。我很惊讶您听到该代码的任何声音,因为您拥有的线程很快就会超出范围。只是因为您将这些变量与类相关联,才会发生任何事情。我个人认为在这种情况下您不需要单独的线程,因为我相信播放是或可以是非阻塞的。尽管如此,你可以按照你的计划使用这样的东西(伪代码):

public bool ShouldPlay;
private void InitAudio(object data) {

var OutDevice = new WaveOut();
var OutStream = new WaveChannel32(new Mp3FileReader(data.ToString()));
var OutDevice.Init(OutStream);

while(!_exitEvent.WaitOne(50ms)){
if(ShouldPlay && !OutDevice.IsPlaying)
OutDevice.Play();
else if(!ShouldPlay && OutDevice.IsPlaying)
OutDevice.Stop();
}
OutDevice.Stop();
OutDevice.Dispose();
OutStream.Dispose();
}

关于c# - 线程之间的线程通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15126460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com