小编ymp*_*tor的帖子

.NET Core中没有AppDomains!为什么?

微软是否有理由选择不支持.NET Core中的AppDomains?

AppDomains在构建长时间运行的服务器应用程序时特别有用,我们可能希望更新服务器加载的程序集是一种优雅的方式,而无需关闭服务器.

如果没有AppDomains,我们如何在长时间运行的服务器进程中替换我们的程序集?

AppDomains还为我们提供了一种隔离服务器代码不同部分的方法.比如,自定义websocket服务器可以在主appdomain中具有套接字代码,而我们的服务在辅助appdomain中运行.

如果没有AppDomains,则无法使用上述方案.

我可以看到一个论点,可能会讨论使用VM的云概念来处理程序集更改而不必承担AppDomains的开销.但这是微软的想法或说法吗?或者他们有针对上述情况的具体原因和替代方案?

.net clr appdomain .net-core

72
推荐指数
6
解决办法
2万
查看次数

如何确定私有IP地址?

到目前为止,我有这个代码:

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地址.

c# asp.net network-programming

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

检查端口是否打开

我似乎无法找到任何告诉我路由器中的端口是否打开的东西.这甚至可能吗?

我现在的代码似乎并没有真正起作用......

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)

.net c# winforms

23
推荐指数
2
解决办法
6万
查看次数

捕获TaskCanceledException并检查Task.Canceled是个好主意?

我团队中有些人非常喜欢使用异步编码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)

实现代码肯定更简单 - 调用者可以选择是否处理异常,但是我不禁担心调用者可能会 …

.net c# task task-parallel-library cancellation-token

21
推荐指数
1
解决办法
7675
查看次数

如何在没有可变变量的情况下在F#中编写"重试"逻辑(只有1次迭代)?

因此,通过尝试避免可变变量,我提出了以下重试逻辑代码,这似乎很难看:

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.)谢谢!

refactoring f#

14
推荐指数
3
解决办法
871
查看次数

如何在F#中设置默认参数值?

以此功能为例:

// 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#

11
推荐指数
3
解决办法
6037
查看次数

已经存在此算法的高阶函数?

我想出了我在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#的高阶函数中的某些东西?如果是,有人可以引用我吗?因为我确定我的代码效率不高,因为它...

collections f# higher-order-functions

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

使用F#和Task <T>的循环并发算法

我有一个像这样的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)

实施将具有以下要求:

  1. 使用3个不同的serverUris对Foo()进行3次(最大)并发调用.
  2. 选择2个最快的成功回复.如果它们给出相同的结果T1和T2(T1 == T2),则停止执行并发请求并忽略/取消正在进行的请求并返回T的安全性.如果T1!= T2,继续执行更多请求(或查看响应)直到找到两个相同的响应.
  3. 如果任何请求失败(抛出ServerException),请尝试使用之前未请求的serverUri.
  4. 如果对所有4个服务器的所有请求都失败,则返回ConnectionError.
  5. 如果只有1个请求成功,则返回T的弱点.

考虑到我不能使用F#的Async并且必须坚持使用C#的Task任务,这很容易吗?我在这一点上有点失落.

concurrency f# asynchronous

3
推荐指数
1
解决办法
130
查看次数