如何在.Net Framework 4.6中处理调用单线程Web服务的多线程测试?

问题描述 投票:0回答:1

我的生成身份验证 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 服务中控制这些多线程调用?

c# multithreading web-services synchronous single-threaded
1个回答
0
投票

一个简单的解决方案是创建一个这样的关键部分:

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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.