冒着听起来像个笨蛋的风险,如何在System.Timers.Timer上实现ISynchronizeInvoke?

我有一个类(没有UI)正在调用mciSendString。我有一个计时器,应该轮询当前状态。来自该类的所有调用均起作用,但不是来自计时器经过的事件的调用。我已将其跟踪到另一个线程上,但是我对此没有更多了解。我想我需要在与该类相同的线程上调用一个委托,但是我还没有运气实现它。

代码示例:

    [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()的结果是我期望的。当计时器触发时,结果(结果)为263,即MCIERR_INVALID_DEVICE_NAME。失败的调用上的threadID与成功的调用不同,这就是为什么我认为需要使用ISynchronizeInvoke的原因。

最佳答案

我在msdn论坛上得到了答案。有人给我发了一条消息,其中包含指向Codeplex(nito.async)的链接。我使用GenericSynchronizingObject完成工作。

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

10-12 06:08