小编Die*_*ego的帖子

在字符串上调用GetHashCode()时获取重复值的概率

我想知道GetHashCode()string实例上调用方法时获取重复值的可能性.例如,根据这篇博文, blairbrainlessness在x86机器上具有相同的哈希码(1758039503).

c# hash-code-uniqueness hashcode hash-collision

22
推荐指数
4
解决办法
6078
查看次数

运行几秒后WCF:EndpointNotFoundException

我正在使用两个应用程序,一个具有配置为使用net.tcp绑定的自托管服务.该服务的ServiceBehaviorAttribute配置为:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,
                 InstanceContextMode = InstanceContextMode.Single,
                 IncludeExceptionDetailInFaults = true,
                 UseSynchronizationContext = false,
                 ValidateMustUnderstand = false)]
Run Code Online (Sandbox Code Playgroud)

对于服务和客户端,transferMode设置为Streamed,超时为:

closeTimeout="00:01:00"
openTimeout="00:00:30"
receiveTimeout="00:02:30"
sendTimeout="00:02:30"
Run Code Online (Sandbox Code Playgroud)

MaxConnections设置为500,ServiceThrottlingBehavior使用WCF 4默认值:

  • MaxConcurrentSessions:100*ProcessorCount
  • MaxConcurrentCalls:16*ProcessorCount
  • MaxConcurrentInstances:默认值是以上两者的总和,它遵循与之前相同的模式.

我使用的是四核机器,并启用了Net.Tcp端口共享服务.

客户端应用程序具有使用ChannelFactory类创建的服务的单个通道.创建通道后,会生成100个线程.每个线程使用该通道以每秒一条消息的频率向服务器发送消息.

运行ok几秒钟后(客户端向服务器发送消息并正确接收它们)会抛出EndpointNotFoundException,并显示以下消息:

Could not connect to net.tcp://localhost/service. The connection attempt lasted 
for a time span of 00:00:02.1777100. TCP error code 10061: No connection could 
be made because the target machine actively refused it 127.0.0.1:808.
Run Code Online (Sandbox Code Playgroud)

奇怪的事情是:

  • 如果我在同一台机器上运行这两个应用程序,则异常的时间跨度大约为2秒,但如果我在我的机器中运行服务器应用程序而在另一台机器中运行客户端应用程序,则异常的时间跨度始终为1秒.
  • 有时候(比如十分之一)异常不会抛出,两个应用程序都能正常工作.
  • 在抛出异常之前,服务器会接收消息并正确处理它们.服务器中不会​​抛出任何异常.

我做了很多测试,减少线程数量,增加线程数量,更改关闭,打开,接收和发送超时值到更低和更高的值,为maxConnections设置更高的值但结果总是相同的,在某些时候抛出EndpointNotFoundException.我即将放弃并更改代码,以便每个线程都有自己的通道,希望这可以解决问题,但我想知道为什么会发生这种情况.如果有人知道我做错了什么或者能指出我正确的方向继续调查它会有所帮助.

c# wcf

6
推荐指数
1
解决办法
5713
查看次数

使用 Viper 将字符串映射作为 Go 中的环境变量传递

对于我正在从事的一个项目,我尝试使用 Viper 将刺痛图作为环境变量传递。我尝试了多种方法来实现这一目标,但没有成功。当我从代码中读取环境变量时,它是空的。这是我正在使用的代码:

// To configure viper
viper.SetEnvPrefix("CONFIG")
viper.AutomaticEnv()
replacer := strings.NewReplacer(".", "_")
viper.SetEnvKeyReplacer(replacer)

// To read the configuration value I tried all this variants:
fmt.Print(viper.GetString("options.values"))
fmt.Print(viper.GetStringMapString("options.values"))
fmt.Print(viper.GetStringMap("options.values"))
Run Code Online (Sandbox Code Playgroud)

这就是我传递值的方式:

CONFIG_OPTIONS_VALUES_ROOT="。"

我也尝试过:

CONFIG_OPTIONS_VALUES="{\"root\": \".\",\"cmd\": \"exec\", \"logging\": \"on\"}"

我想要处理 env 变量中的值传递的方式是:

values := viper.GetStringMapString("options.values")
for key, val := range values {
    fmt.Printf("Key: %s, Value: %s", key, val)
}
Run Code Online (Sandbox Code Playgroud)

如果我将此配置写入配置文件并使用 viper 读取它,我可以完美地做到这一点:

options:
        values:
                root: .
                cmd: exec
                logging: on
                #more values can be added here 
Run Code Online (Sandbox Code Playgroud)

希望有人能在这里指出我正确的方向。

go viper-go

5
推荐指数
1
解决办法
1万
查看次数

标签 统计

c# ×2

go ×1

hash-code-uniqueness ×1

hash-collision ×1

hashcode ×1

viper-go ×1

wcf ×1