iis 工作处理器中的静态变量不能正常工作?

wvt8vs2t  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(438)

我有2台服务器用于负载均衡器,每台都有8 worker processors。我希望有一个值在每台服务器中的工作进程之间共享。我的代码如下:

static string _token;
   public async Task<string> GetokenAsync()
    {
        if (token.isExpire() || string.IsNullOrWhiteSpace(token))
        {
            await _semaphoreSlim.WaitAsync();
            if (token.isExpire() || string.IsNullOrWhiteSpace(token))
            {
                try
                {
                  token =  await GetTokenFromAPIServiceAsync();
                }
                finally
                {
                    _semaphoreSlim.Release();
                }
            }
            else
                _semaphoreSlim.Release();
        }
        return token;
    }

但我猜静态变量不能正常工作时,有许多工人,因为我认为他们manipulate静态字段。所以我决定使用redis而不是static field,如下所示:

public async Task<string> GetokenAsync()
    {
         var token = await GetFromRedisAsync();
        if (string.IsNullOrWhiteSpace(token))
        {
            await _semaphoreSlim.WaitAsync();
            if (token.isExpire() || string.IsNullOrWhiteSpace(token))
            {
                try
                {
                  token =  await GetFromServiceAndSetToRedisAsync();
                }
                finally
                {
                    _semaphoreSlim.Release();
                }
            }
            else
                _semaphoreSlim.Release();
        }
        return token;
    }

使用redis和semaphorSlim锁线程是一个好的解决方案吗?信号量是否在worker中工作,或者某些worker可能会改变redis中的值?

gzjq41n4

gzjq41n41#

信号量是否在worker中工作,或者某些worker可能会改变redis中的值?
如果目标是在同一服务器上的不同进程之间共享信息,那么SemaphoreSlim不是一个解决方案-它只适用于单个应用程序示例。对于跨进程同步(在同一服务器上),您需要使用命名的SemaphoreMutex
或者,你可以查看Redis提供的机制来执行同步(例如,参见thisthis,如果需要,它还将启用在不同服务器之间共享令牌的选项)。

相关问题