我想在第一包数据出现时启动我的mediaElement(MediaElement类的实例)。所以我这样写了。
private void SocketOnMessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
{
if (isPaused) return;
if (!isStarted)
{
mediaElement.Play();
isStarted = true;
}
var r = args.GetDataReader();
var l = r.UnconsumedBufferLength;
var buff = new byte[l];
r.ReadBytes(buff);
if (System.Text.Encoding.UTF8.GetString(buff, 0, buff.Length) != "stop")
{
AudioSteam.AddBytes(buff);
}
else
{
mediaElement.Pause();
isStarted = false;
Debug.WriteLine("stop");
}
buff = null;
}
当然elier我为mediaElement(MediaStreamSource)设置了源代码。
var socket = new DatagramSocket();
socket.MessageReceived += SocketOnMessageReceived;
await socket.BindServiceNameAsync("4444");
HostName multicast = new HostName("230.0.0.1");
socket.JoinMulticastGroup(multicast);
isPaused = true;
isStarted = false;
AudioSteam = new Sine440AudioStreamSource(44100);
mdiaElement.SetSource(AudioSteam);
首先,我在mediaElement.Start()获得System.IO.FileNotFoundException
然后System.UnauthorizedAccessException
;我不知道为什么。
任何建议都将受到赞赏。
答案 0 :(得分:0)
事实证明DatagramSocket.ReceivedMessage
方法正在其他线程上运行,因此如果您想要从方法范围中访问变量,则需要使用Dispatcher.BeginInvoke()
Dispatcher.BeginInvoke(() =>{
//Code
});
总而言之,我辞职了。