我的生成身份验证 PIN 码的 Web 服务不管理多线程,当它仅在一个线程中执行单个调用时,我们没有问题。这个系统将被替换,但现在我需要纠正这个错误。
当其他多线程服务调用 Web 服务时,通知最终会被多次发送到同一个 PIN 码,而其他通知最终不会发送。
接口:
[ServiceContract]
public interface IGenPin
{
[OperationContract]
ResponseResult GenPin(ClientPin client);
}
班级:
public class GenPinWS : IGenPin
{
public ResponseResult GenPin(ClientPin client)
{
ResponseResult msgResponseResult = null;
string strGuidTrace = Guid.NewGuid().ToString().Replace("-", "");
try
{
Traceability.InsertTraceability(...);
ServiceGenPin _serviceGenPin = new ServiceGenPin();
msgResponseResult = _serviceGenPin.GenPin(client, strGuidTrace); //here I send the PIN notifications
Traceability.InsertTraceability(...);
return msgGpinResponseResult;
}
catch (Exception ex)
{
...
}
return msgResponseResult;
}
}
我已经尝试过实现红绿灯和队列,但没有成功。代码是同步的并且全部耦合(我知道这很糟糕,但重写不是一个选择)。
我希望只向生成的每个 PIN 码发送一次通知。 如何从我的单线程 Web 服务中控制这些多线程调用?
一个简单的解决方案是创建一个这样的关键部分:
public class GenPinWS : IGenPin
{
private static readonly object access = new object();
public ResponseResult GenPin(ClientPin client)
{
lock(access)
{
ResponseResult msgResponseResult = null;
string strGuidTrace = Guid.NewGuid().ToString().Replace("-", "");
try
{
Traceability.InsertTraceability(...);
ServiceGenPin _serviceGenPin = new ServiceGenPin();
msgResponseResult = _serviceGenPin.GenPin(client, strGuidTrace); //here I send the PIN notifications
Traceability.InsertTraceability(...);
return msgGpinResponseResult;
}
catch (Exception ex)
{
// ...
}
return msgResponseResult;
}
}
}