GRPC多线程下IInterfacedControl实例属性同步问题求助
多线程下GRPC应用中IInterfacedControl属性同步问题
我正在开发一个GRPC应用,通过接口与多个不同类的对象交互。主类持有一个IInterfacedControl实例,对外通过GetInterfacedControl()方法提供访问:
private IInterfacedControl _interfaceControl; public IInterfacedControl GetInterfacedControl() => _interfaceControl;
在GRPC服务方法中,我通过调用GetInterfacedControl().SomeProperty来访问控件属性。目前遇到的问题是:当两个请求同时进入时,类的属性值无法同步——部分请求会修改多个属性,虽然已经在类内部对部分变量和方法做了同步处理,但不同线程中类属性值仍出现不一致的情况。
涉及的GRPC服务方法
- 检查连接状态:定期通过接口类的
IsConnected变量检查服务是否已连接
public override Task<IsConnectedResponse> IsConnected(IsConnectedRequest request, ServerCallContext context) { var isConnected = _factory.GetInterfacedControl().IsConnected; LogService.LogCallersGetter(isConnected.ToString()); return Task.FromResult(new IsConnectedResponse { IsConnected = isConnected }); }
- 尝试连接服务:触发服务连接操作
public override Task<ConnectResponse> AttemptConnect(ConnectRequest request, ServerCallContext context) { string action = $"Connect?: {request.Connect}"; LogService.LogCallers(action); try { _factory.GetInterfacedControl().Connect(request.Connect); } catch (Exception ex) { Logger.Log(LogLevel.Error, ex.Message); } return Task.FromResult(new ConnectResponse { }); }
第三方服务与属性更新逻辑
应用通过WCF连接第三方服务,当第三方服务连接到我的应用时(通常发生在上述两个方法执行期间),不同线程持有接口类的不同上下文,导致属性值不一致。
有三个入口点会调用RaiseUpdateConnected方法更新IsConnected属性,其中一个入口会在判定未连接时显式调用RaiseUpdateConnected(false):
internal void RaiseUpdateConnected(bool isConnected) { IsConnected = isConnected; EUpdateConnected?.Invoke(this, isConnected); }
Connect方法中,eventBeacon会在服务建立连接时被订阅,我尝试在此处加锁同步eventBeacon非空的情况:
public void Connect() { eventBeacon?.Invoke(null, new EventArgs()); if (eventBeacon == null) RaiseUpdateConnected(false); }
核心需求
调试确认IInterfacedControl只有一个实例,但不同线程的上下文导致属性值不一致。需要找到能同步整个IInterfacedControl类的方法,确保所有线程中变量更新一致。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

