我有2个程序,1个用于发送UDP广播消息,1个用于监听此广播.我的问题是,有时当我发送广播时,接收器会收到2条消息.为什么?
接收者代码:
public class Receiver {
private readonly UdpClient udp = new UdpClient(15000);
private void StartListening()
{
this.udp.BeginReceive(Receive, new object());
}
private void Receive(IAsyncResult ar)
{
IPEndPoint ip = new IPEndPoint(IPAddress.Any, 15000);
byte[] bytes = udp.EndReceive(ar, ref ip);
string message = Encoding.ASCII.GetString(bytes);
StartListening();
}
}
Run Code Online (Sandbox Code Playgroud)
发件人代码:
public class Sender {
public void Send() {
UdpClient client = new UdpClient();
IPEndPoint ip = new IPEndPoint(IPAddress.Broadcast, 15000);
byte[] bytes = Encoding.ASCII.GetBytes("Foo");
client.Send(bytes, bytes.Length, ip);
client.Close();
}
}
Run Code Online (Sandbox Code Playgroud) 我是那些热爱VS编辑和继续的人之一.因此我开发了32位应用程序.但是当我在调试模式下运行单元测试并尝试编辑一行时,我得到了通常的"不允许对64位应用程序进行更改".信息.我的所有组件都标记为x86,nunit安装为32位应用程序.我的系统是64位的.
如何强制nunit作为32位应用程序运行?
我已经运行了几个月的 RabbitMQ 服务器。今天早上我无法连接到它,我的应用程序超时并且管理客户端没有响应。重新启动了机器。应用程序仍然超时。我可以登录到管理客户端,但看到以下消息:
虚拟主机/在节点 rabbit@MQT01 上遇到错误并且可能无法访问
我所有的队列都在那里,但看不到任何交流。
我希望有人能帮我弄清楚发生了什么。我查看了日志,但找不到任何好的提示。
这是日志的一部分:
2018-09-11 09:39:42 =ERROR REPORT====
** Generic server <0.281.0> terminating
** Last message in was {'$gen_cast',{submit_async,#Fun<rabbit_queue_index.36.122888644>}}
** When Server state == undefined
** Reason for termination ==
** {function_clause,[{rabbit_queue_index,journal_minus_segment1,[{{true,<<172,190,166,92,192,205,125,125,36,223,114,188,53,139,128,108,0,0,0,0,0,0,0,0,0,0,26,151>>,<<>>},no_del,no_ack},{{true,<<89,173,78,227,188,37,119,171,231,189,220,236,244,79,138,177,0,0,0,0,0,0,0,0,0,0,23,40>>,<<>>},no_del,no_ack}],[{file,"src/rabbit_queue_index.erl"},{line,1231}]},{rabbit_queue_index,'-journal_minus_segment/3-fun-0-',4,[{file,"src/rabbit_queue_index.erl"},{line,1208}]},{array,sparse_foldl_3,7,[{file,"array.erl"},{line,1684}]},{array,sparse_foldl_2,9,[{file,"array.erl"},{line,1678}]},{rabbit_queue_index,'-recover_journal/1-fun-0-',1,[{file,"src/rabbit_queue_index.erl"},{line,915}]},{lists,map,2,[{file,"lists.erl"},{line,1239}]},{rabbit_queue_index,segment_map,2,[{file,"src/rabbit_queue_index.erl"},{line,1039}]},{rabbit_queue_index,recover_journal,1,[{file,"src/rabbit_queue_index.erl"},{line,906}]}]}
2018-09-11 09:39:42 =CRASH REPORT====
crasher:
initial call: worker_pool_worker:init/1
pid: <0.281.0>
registered_name: []
exception exit: {{function_clause,[{rabbit_queue_index,journal_minus_segment1,[{{true,<<172,190,166,92,192,205,125,125,36,223,114,188,53,139,128,108,0,0,0,0,0,0,0,0,0,0,26,151>>,<<>>},no_del,no_ack},{{true,<<89,173,78,227,188,37,119,171,231,189,220,236,244,79,138,177,0,0,0,0,0,0,0,0,0,0,23,40>>,<<>>},no_del,no_ack}],[{file,"src/rabbit_queue_index.erl"},{line,1231}]},{rabbit_queue_index,'-journal_minus_segment/3-fun-0-',4,[{file,"src/rabbit_queue_index.erl"},{line,1208}]},{array,sparse_foldl_3,7,[{file,"array.erl"},{line,1684}]},{array,sparse_foldl_2,9,[{file,"array.erl"},{line,1678}]},{rabbit_queue_index,'-recover_journal/1-fun-0-',1,[{file,"src/rabbit_queue_index.erl"},{line,915}]},{lists,map,2,[{file,"lists.erl"},{line,1239}]},{rabbit_queue_index,segment_map,2,[{file,"src/rabbit_queue_index.erl"},{line,1039}]},{rabbit_queue_index,recover_journal,1,[{file,"src/rabbit_queue_index.erl"},{line,906}]}]},[{gen_server2,terminate,3,[{file,"src/gen_server2.erl"},{line,1161}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,247}]}]}
ancestors: [worker_pool_sup,rabbit_sup,<0.262.0>]
message_queue_len: 0
messages: []
links: [<0.276.0>,<0.336.0>,#Port<0.31196>]
dictionary: [{fhc_age_tree,{1,{{10352640,#Ref<0.1077581647.1695285251.67028>},true,nil,nil}}},{worker_pool_worker,true},{rand_seed,{#{jump => #Fun<rand.16.15449617>,max => 288230376151711743,next => #Fun<rand.15.15449617>,type => exsplus},[257570830250844431|246837015578235662]}},{worker_pool_name,worker_pool},{{"c:/Users/dfpsb/AppData/Roaming/RabbitMQ/db/RABBIT~1/msg_stores/vhosts/628WB79CIFDYO9LJI6DKMI09L/queues/9GD33C2I2PKZ7A8QHZ4MWWCKE/journal.jif",fhc_file},{file,1,true}},{{#Ref<0.1077581647.1695285251.67028>,fhc_handle},{handle,{file_descriptor,prim_file,{#Port<0.31196>,1808}},#Ref<0.1077581647.1695285251.67028>,240,false,0,infinity,[],<<>>,0,0,0,0,0,false,"c:/Users/dfpsb/AppData/Roaming/RabbitMQ/db/RABBIT~1/msg_stores/vhosts/628WB79CIFDYO9LJI6DKMI09L/queues/9GD33C2I2PKZ7A8QHZ4MWWCKE/journal.jif",[write,binary,raw,read],[{write_buffer,infinity}],true,true,10352640}}]
trap_exit: false
status: running
heap_size: 10958
stack_size: 27
reductions: 104391 …
Run Code Online (Sandbox Code Playgroud)从C#文档:
Save方法是Insert和Update的组合.如果文档的Id成员具有值,则假定它是现有文档并且在文档上保存调用Update(设置Upsert标志以防万一它实际上是新文档).
我正在我的所有域对象继承的基类中手动创建我的ID.所以我的所有域对象在插入MongoDB时都有一个ID.
问题是,我应该使用collection.Save并保持我的界面简单,或者这实际上导致Save-call(带有Upsert标志)的一些开销,我应该使用collection.Insert和Update吗?
我在想的是Save方法首先调用Update,然后确定我的新对象首先不存在,然后调用Insert.我错了吗?有没有人测试过这个?
注意:我使用InsertBatch插入批量数据,因此在这种情况下,大数据块无关紧要.
编辑,跟进
我写了一个小测试,以确定调用Update with Upsert标志是否有一些开销,所以Insert可能会更好.原来它们以相同的速度运行.请参阅下面的测试代码.MongoDbServer和IMongoDbServer是我自己的通用接口,用于隔离存储设施.
IMongoDbServer server = new MongoDbServer();
Stopwatch sw = new Stopwatch();
long d1 = 0;
long d2 = 0;
for (int w = 0; w <= 100; w++)
{
sw.Restart();
for (int i = 0; i <= 10000; i++)
{
ProductionArea area = new ProductionArea();
server.Save(area);
}
sw.Stop();
d1 += sw.ElapsedMilliseconds;
sw.Restart();
for (int i = 0; i <= 10000; i++)
{
ProductionArea area = new ProductionArea();
server.Insert(area);
}
sw.Stop();
d2 …
Run Code Online (Sandbox Code Playgroud) 我正在 Azure 中设置 Service Fabric 群集,并希望通过 https 运行 Web API(使用 .NET Core)。我想使用我的 CA 签名通配符 (*.mydomain.com) 证书来访问此 API。但我对创建集群时在哪里使用它有点困惑,是集群还是客户端证书?我正在考虑客户端证书,但文档指出这是用于管理工具(即资源管理器),所以我不确定如何继续。
是的,我已经阅读了大量的帖子和资源,但我仍然觉得这很令人困惑。
我正在研究的应用程序(.NET C#)正在我们客户自己的服务器上部署,因此我们可以使用ClickOnce在客户工作计算机上安装应用程序.由于它是客户自己的服务器,因此IP永远不会相同.这是标准ClickOnce更新机制的问题.这是我最终想要的场景:
这可能吗?如何?
我已经阅读了如何移动ClickOnce部署包,这可能有效,但有时客户决定更改服务器IP.