了解事件发送的时间/方式

时间:2010-12-01 17:27:41

标签: c# events event-handling

我有这样的代码:

// Create event handler delegate
symbolReader.ReadNotify += new EventHandler(symbolReader_ReadNotify);

在我的手持设备上扫描条形码时,会调用symbolReader_ReadNotify

这是该方法的简化版本:

/// <summary>
/// Event that fires when a Symbol scanner has performed a scan.
/// </summary>
private void symbolReader_ReadNotify(object sender, EventArgs e)
{
    ReaderData readerData = symbolReader.GetNextReaderData();

    // If it is a successful scan (as opposed to a failed one)
    if (readerData.Result == Results.SUCCESS)
    {
        // Setup the next scan (because we may need the scanner 
        // in the OnBarcodeScan event below
        Start();

        // Get the handle of the window that the user was on when the scan was sent.
        IntPtr handle = CoreDLL.GetTopWindow();

        // If we have a barcode scanner method for this window then call that delegate now.
        if (_scanDelegates.ContainsKey(handle))
        {
            Action<BarcodeScannerEventArgs> scanDelegate;
            // Get the method to call for this handle 
            // (previously added to the _scanDelegates dictionary)
            bool delegateRetrieved = _scanDelegates.TryGetValue(handle, out scanDelegate);
            if (delegateRetrieved && (scanDelegate != null))
                scanDelegate(e);

        }
    }
}

大部分时间都可以正常工作。但是当对scanDelegate的调用打开一个新窗口,也需要接受扫描时,事件(symbolReader.ReadNotify)不会触发(当在该窗口上完成扫描时)。但是一旦窗口关闭(并且scanDelegate(e)返回),事件就会触发(但现在我将它路由到错误的窗口。

是否有人告诉应用程序发送事件?它是否像Windows消息一样工作(即有一种方法可以刷新消息),还是只是符号库无法发送事件,直到为时已晚?)

我尝试过的一件事就是在打开的窗口中循环调用Application.DoEvents。但这似乎不起作用。

注意:这是一个Compact Framework应用程序,但我认为这不是Compact Framework问题,因此我没有使用Compact Framework对其进行标记。

任何在扫描发生时触发事件的建议(就像它不是嵌套扫描时那样)会很棒!

1 个答案:

答案 0 :(得分:1)

scanDelegate(e)是否以对话框的形式打开新窗口?如果是这样,它将阻止事件再次提升,直到它被关闭,因为它是从同一个事件处理程序中调用(打开)。

您可以通过在处理事件后延迟开放来解决问题,而不是将其作为对话框打开或在新线程上打开(或在代理上使用begininvoke)