我正在开发一个Windows CE 6程序,它由Visual Studio 2008解决方案中的两个项目组成,用VB.Net编写。之前,我为Windows桌面编写了一个类似的程序,所以我想尝试尽可能多地重用代码。
通用结构是:第一个项目包含前端gui,第二个项目是用于串行通信的库。该库应该可以重用于其他GUI,并且不能依赖于图形内容,例如Control
。
在我使用SerialPort
- 实例的第二个库项目中,数据的接收是通过SerialPort.DataReceived
事件处理的。由于DataReceived
出现在第二个帖子中,我在桌面变体中使用SynchronizationContext
,Invoke
无法依赖图形内容。以下是一个简单的例子:
Public Class Comm Private dllContext As SynchronizationContext Private port as SerialPort Public Sub New() dllContext = SynchronizationContext.Current port = new SerialPort("COM1") End Sub Public Sub port_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles port.DataReceived Dim data(-1) as Byte ' ' Read Received Data into the data-Variable, yet. ' If (dllContext IsNot Nothing) then dllContext.Send(Sub() RaiseEvent DataReceived(Me, data), Nothing) Else RaiseEvent DataReceived(Me, data) End If End Sub End Class
将此代码移植到.Net CF时,没有SynchronizationContext
可用。我在网上搜索,发现这些:
http://www.planetgeek.ch/2009/02/03/part-i-mimic-synchronizationcontext-behaviour-on-net-cf/
http://www.planetgeek.ch/2009/02/15/part-ii-mimic-synchronizationcontext-behaviour-on-net-cf/
但是作者正在使用Control.Invoke,我不想使用它(它在System.Windows.Forms中)
由于我几天没有发现其他方法,我的问题是:如何解决这个问题?
谢谢,
了Christoph