gpt4 book ai didi

C# ISynchronizeInvoke 问题

转载 作者:行者123 更新时间:2023-11-30 22:50:27 25 4
gpt4 key购买 nike

冒着听起来像个菜鸟的风险,我该如何在 System.Timers.Timer 上实现 ISynchronizeInvoke?

我有一个正在调用 mciSendString 的类(无 UI)。我有一个计时器,应该轮询当前状态。来自类(class)的所有电话都有效,但不是来自计时器已用事件的电话。我已经追踪到它在不同的线程上,但我没有比这更进一步。我认为我需要在与类相同的线程上调用委托(delegate),但我还没有成功完成它。

代码示例:

    [DllImport("winmm.dll")]
private static extern Int32 mciSendString(string command, StringBuilder buffer, Int32 bufferSize, IntPtr hwndCallback);

public cPlayer()
{
tmrPoll = new System.Timers.Timer(1000);
tmrPoll.Enabled = false;
tmrPoll.Elapsed += new ElapsedEventHandler(tmrPoll_tick);
}

public void tmrPoll_tick(object source, ElapsedEventArgs e)
{
Poll();
}

private void Poll()
{
Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
tmrPoll.Stop();
int res = 0;

res = mciSendString("status MediaFile position", _sbBuffer, _sbBuffer.Capacity, IntPtr.Zero);
if (res == 0) _position = int.Parse(_sbBuffer.ToString());
if (res == 0)
{
Console.WriteLine("Position = " + _sbBuffer.ToString());
} else {
Console.WriteLine("Failed: Error " + res.ToString());
}

res = mciSendString("status MediaFile length", _sbBuffer, _sbBuffer.Capacity, IntPtr.Zero);
if (res == 0) Console.WriteLine("Length = " + _sbBuffer.ToString());
if (res == 0) _length = int.Parse(_sbBuffer.ToString());

res = mciSendString("status MediaFile mode", _sbBuffer, _sbBuffer.Capacity, IntPtr.Zero);
if (res == 0) Console.WriteLine("Mode = " + _sbBuffer.ToString());
}

private void SendCommand(string cmd)
{
mciSendString(cmd, null, 0, IntPtr.Zero);
Poll();

}

为澄清起见,如果我从 SendCommand 调用(无论它是什么,Play、Stop 等),它会工作并且 Poll() 的结果是我所期望的。当计时器触发时,结果 (res) 为 263,即 MCIERR_INVALID_DEVICE_NAME。失败调用的 threadID 与成功调用不同,这就是为什么我认为我需要使用 ISynchronizeInvoke。

最佳答案

我在 msdn 论坛上得到了答案。有人给我留言,其中包含 codeplex ( nito.async) 的链接。我使用 GenericSynchronizingObject 来完成工作。

关于C# ISynchronizeInvoke 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/567953/

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