微软是否有理由选择不支持.NET Core中的AppDomains?
AppDomains在构建长时间运行的服务器应用程序时特别有用,我们可能希望更新服务器加载的程序集是一种优雅的方式,而无需关闭服务器.
如果没有AppDomains,我们如何在长时间运行的服务器进程中替换我们的程序集?
AppDomains还为我们提供了一种隔离服务器代码不同部分的方法.比如,自定义websocket服务器可以在主appdomain中具有套接字代码,而我们的服务在辅助appdomain中运行.
如果没有AppDomains,则无法使用上述方案.
我可以看到一个论点,可能会讨论使用VM的云概念来处理程序集更改而不必承担AppDomains的开销.但这是微软的想法或说法吗?或者他们有针对上述情况的具体原因和替代方案?
到目前为止,我有这个代码:
NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface adapter in adapters)
{
IPInterfaceProperties properties = adapter.GetIPProperties();
foreach (IPAddressInformation uniCast in properties.UnicastAddresses)
{
// Ignore loop-back addresses & IPv6
if (!IPAddress.IsLoopback(uniCast.Address) &&
uniCast.Address.AddressFamily!= AddressFamily.InterNetworkV6)
Addresses.Add(uniCast.Address);
}
}
Run Code Online (Sandbox Code Playgroud)
如何过滤私有IP地址?我以同样的方式过滤环回IP地址.
我似乎无法找到任何告诉我路由器中的端口是否打开的东西.这甚至可能吗?
我现在的代码似乎并没有真正起作用......
private void ScanPort()
{
string hostname = "localhost";
int portno = 9081;
IPAddress ipa = (IPAddress) Dns.GetHostAddresses(hostname)[0];
try
{
System.Net.Sockets.Socket sock =
new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork,
System.Net.Sockets.SocketType.Stream,
System.Net.Sockets.ProtocolType.Tcp);
sock.Connect(ipa, portno);
if (sock.Connected == true) // Port is in use and connection is successful
MessageBox.Show("Port is Closed");
sock.Close();
}
catch (System.Net.Sockets.SocketException ex)
{
if (ex.ErrorCode == 10061) // Port is unused and could not establish connection
MessageBox.Show("Port is Open!");
else
MessageBox.Show(ex.Message);
}
}
Run Code Online (Sandbox Code Playgroud) 我团队中有些人非常喜欢使用异步编码Task.有时他们喜欢使用CancellationToken参数.
我不确定的是我们作为一个团队是否应该使用这种代码风格(A):
async Task<someObject> DoStuff(CancellationToken t)
{
while (!t.IsCanceled)
{
try {
Task.Delay(5000, t);
}
catch (AggregateException e) // or is it TaskCanceledException or OperationCanceledException? I don't know? :)
{
}
// poll something, return someObject, or null
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
这显然意味着调用者可能必须自己检查取消令牌以确定是否继续处理,并且他们可能必须处理null retVals:
var retVal = await DoStuff(token);
if (token.IsCanceled) { ... }
Run Code Online (Sandbox Code Playgroud)
但是,如果我们采用依赖于TaskCanceledException的第二种代码(B):
async Task<someObject> DoStuff(CancellationToken t)
{
while(true)
{
Task.Delay(5000, t);
// poll something, return someObject, or null
}
}
Run Code Online (Sandbox Code Playgroud)
实现代码肯定更简单 - 调用者可以选择是否处理异常,但是我不禁担心调用者可能会 …
因此,通过尝试避免可变变量,我提出了以下重试逻辑代码,这似乎很难看:
let result = TryConnect()
match result with
| ErrorConnecting ->
SetupConnectionParameters()
let resultAgain = TryConnect()
match resultAgain with
| ErrorConnecting ->
Console.Error.WriteLine("Setup failed!")
Environment.Exit(7)
| Success(value) -> PerformOperations(value)
| Success(value) -> PerformOperations(value)
Run Code Online (Sandbox Code Playgroud)
有没有办法减少一些重复?(记住,没有mutablevars.)谢谢!
以此功能为例:
// Sequence of random numbers
open System
let randomSequence m n=
seq {
let rng = new Random()
while true do
yield rng.Next(m,n)
}
randomSequence 8 39
Run Code Online (Sandbox Code Playgroud)
该randomSequence函数有两个参数:m, n.这作为正常功能正常工作.我想设置默认值m, n,例如:
(m = 1, n = 100)
Run Code Online (Sandbox Code Playgroud)
如果没有给出参数,则该函数采用默认值.在F#中有可能吗?
我想出了我在F#代码中需要的这个简单的算法(将元组列表转换为列表键的映射集合):
let MergeIntoMap<'K,'V when 'K: comparison>(from: seq<'K*'V>): Map<'K,seq<'V>>=
let keys = from.Select(fun (k,v) -> k)
let keyValuePairs = seq {
for key in keys do
let valsForKey = from.Where(fun (k,v) -> key = k).Select(fun (k,v) -> v) |> seq
yield key,valsForKey
}
keyValuePairs |> Map.ofSeq
Run Code Online (Sandbox Code Playgroud)
输入示例:
[ ("a", 1); ("b", 2), ("a", 3) ]
Run Code Online (Sandbox Code Playgroud)
输出:
dict [ ("a", [1; 3]), ("b", [2]) ]
Run Code Online (Sandbox Code Playgroud)
而且我认为这必须是BCL或F#的高阶函数中的某些东西?如果是,有人可以引用我吗?因为我确定我的代码效率不高,因为它...
我有一个像这样的C#API:
Task<T> Foo(serverUri)
Run Code Online (Sandbox Code Playgroud)
假设我有4个可能的服务器.我想实现一个将返回DiscUnionBar类型的函数:
type DiscUnionBar of T =
Safe of T | Weak of T | ConnectionError
Run Code Online (Sandbox Code Playgroud)
实施将具有以下要求:
考虑到我不能使用F#的Async并且必须坚持使用C#的Task任务,这很容易吗?我在这一点上有点失落.
f# ×4
.net ×3
c# ×3
.net-core ×1
appdomain ×1
asp.net ×1
asynchronous ×1
clr ×1
collections ×1
concurrency ×1
refactoring ×1
task ×1
winforms ×1