这是我的情况。我已经编写了一个wcf服务,它调用供应商的一个代码库来执行操作,例如登录、注销等。此操作的一个要求是我们有一个后台线程来接收由于该操作而产生的事件。例如,登录操作在主线程上发送。然后,由于登录,从供应商服务接收到几个事件。可以接收1、2或多个事件。后台线程在计时器上运行,它接收这些事件并在WCF服务中激发一个事件,通知新事件已到达。
我已经在双工模式下实现了WCF服务,并计划使用回调来通知UI事件已经到达。我的问题是:如何将新事件从后台线程发送到执行服务的线程?
现在,当我打电话的时候
OperationContext.Current.GetCallbackChannel<IMyCallback>()
,OperationContext为空。有没有一个标准的模式来解决这个问题?
我正在使用Persession作为服务合同的会话模式。
更新:
我想通过演示如何从供应商代码接收事件,我可以更清楚地说明我的具体场景。我的库接收每个事件,确定事件是什么,并为该特定事件触发一个事件。
我有另一个项目,它是一个类库,专门用于连接到供应商服务。我将发布服务的整个实现,以提供更清晰的画面:
[ServiceBehavior(
InstanceContextMode = InstanceContextMode.PerSession
)]
public class VendorServer:IVendorServer
{
private IVendorService _vendorService; // This is the reference to my class library
public VendorServer()
{
_vendorServer = new VendorServer();
_vendorServer.AgentManager.AgentLoggedIn += AgentManager_AgentLoggedIn; // This is the eventhandler for the event which arrives from a background thread
}
public void Login(string userName, string password, string stationId)
{
_vendorService.Login(userName, password, stationId); // This is a direct call from the main thread to the vendor service to log in
}
private void AgentManager_AgentLoggedIn(object sender, EventArgs e)
{
var agentEvent = new AgentEvent
{
AgentEventType = AgentEventType.Login,
EventArgs = e
};
}
}
agentEvent对象包含回调作为其属性之一,我想我会像这样执行回调:
agentEvent.Callback = OperationContext.Current.GetCallbackChannel<ICallback>();
agentEvent是在服务中定义的对象:
[DataContract]
public class AgentEvent
{
[DataMember]
public EventArgs EventArgs { get; set; }
[DataMember]
public AgentEventType AgentEventType { get; set; }
[DataMember]
public DateTime TimeStamp{ get; set; }
[DataMember]
public IVendorCallback Callback { get; set; }
}
IvendorCallback如下:
public interface IVendorCallback
{
[OperationContract(IsOneWay = true)]
void SendEvent(AgentEvent agentEvent);
}
回调在客户机上实现,并使用agentEvent的eventargs-porperty在UI上填充数据。
如何将operationContext.current实例从主线程传递到后台线程?