来自外部回调的事件

时间:2013-10-10 19:08:27

标签: c# events callback invoke

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

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

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

请给我一些线索。以下是代码段:

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
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

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");
        }
    }
}