【问题标题】:Event from external callback来自外部回调的事件
【发布时间】:2013-10-10 19:08:26
【问题描述】:

我正在使用用 ANSI C 编写的自定义 DLL 创建一个数据发送器项目。我的目标是发送数据块,每个数据块都必须在 OnDataSendingDone 回调中构建发送后确认。

问题是我不知道如何将该回调挂钩到一个事件,所以我可以在每个SendByte 之后等待它。也许事件不是一个好主意。

我的问题是:如何在SendByte 之后等待OnDataSendingDone 回调?

请给我一些线索。这是代码sn-p:

class LibWrapper
{
    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SetCallback")]
    public static extern bool SetCallback(byte functype, Delegate func);

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void CallbackDelegate(UInt32 handle);

    private static CallbackDelegate OnDataSendingDone;

    public void OnDataSendingDoneCallback(CallbackDelegate callback)
    {
        OnDataSendingDone_ft = new CallbackDelegate2(callback);
        SetCallback(FT_DATASENDINGDONE, OnDataSendingDone_ft);
    }
}

class Transmitter
{
    LibWrapper lib = new LibWrapper();

    byte[] data = new byte[10];

    public void OnDataSendingDone(UInt32 handle)
    {
        return;
    }

    lib.OnDataSendingDoneCallback(OnDataSendingDone);

    public void TransmitData()
    {
        // here: sequential data transmission   
        foreach (byte b in data)
        {
            lib.SendByte(b);
            // here: wait for OnDataSendingDone
        }
    }
}

【问题讨论】:

    标签: c# events callback invoke


    【解决方案1】:

    如果我理解正确,你可以这样做:

    class Transmitter
    {
        LibWrapper lib = new LibWrapper();
        private AutoResetEvent evt = new AutoResetEvent(false);
        byte[] data;
    
        public void OnDataSendingDone(UInt32 handle)
        {
            evt.Set();
        }
    
        public void TransmitData()
        {
            // here: sequential data transmission   
            foreach (byte b in data)
            {
                lib.SendByte(b);
                if (!evt.WaitOne(15000)) // or whatever timeout makes sense
                    throw new Exception("timed out");
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      相关资源
      最近更新 更多