小编Jam*_*aix的帖子

在C#7中,我如何"滚动自己的"类似任务的类型与异步一起使用?

C#7的一个较少谈论的功能是"通用异步返回类型",微软将其描述为:

从异步方法返回Task对象可能会在某些路径中引入性能瓶颈.Task是一个引用类型,因此使用它意味着分配一个对象.如果使用async修饰符声明的方法返回缓存结果或同步完成,则额外分配可能会成为性能关键代码段中的重要时间成本.如果这些分配发生在紧密的循环中,它可能会变得非常昂贵.

新的语言功能意味着异步方法可能除了返回其他类型Task,Task<T>void.返回的类型仍必须满足异步模式,这意味着必须可以访问GetAwaiter方法.作为一个具体示例,ValueTask类型已添加到.NET框架中以使用此新语言功能:

这听起来不错,但我不能在我的生活中找到任何不仅仅使用股票ValueTask<T>类型的例子.我想制作类似自己的任务类型.具体来说,我想要一个行为类似于a的类型Task<T>,但具有更多功能的错误处理方式.

这是我在项目中用于功能错误处理的类型:

public class Try<T> {
    public T Data { get; }
    public Exception Error { get; }

    public bool HasData => Error == null;
    public bool HasError => Error != null;

    public Try(T data) {
        Data = data;
    }

    public Try(Exception error) {
        Error = error;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我认为我的自定义等待类型应该是这样的:

public class TryTask<T> : Task<Try<T>> {

    public TryTask(Func<Try<T>> func)
        : base(func) { }

    //GetAwaiter is defined on …
Run Code Online (Sandbox Code Playgroud)

c# async-await c#-7.0

26
推荐指数
1
解决办法
2574
查看次数

Int32.Parse与Single.Parse - ("1,234")和("1,2,3,4").为什么int和浮点类型以不同方式解析分隔符字符?

在C#中:

抛出一个FormatException,似乎不应该:

Int32.Parse("1,234");
Run Code Online (Sandbox Code Playgroud)

这不,这似乎是正常的:

Single.Parse("1,234");
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,这解析得很好:

Single.Parse("1,2,3,4"); //Returns 1234
Run Code Online (Sandbox Code Playgroud)

我的本地文化是EN-US,,默认的千位分隔符char也是如此.

主要问题:为什么不一致?

另外:为什么Parse("1,2,3,4")工作?它似乎只是在解析之前删除本地分隔符char的所有实例.我知道在正则表达式检查或类似的东西中会有额外的运行时开销,但什么时候数字文字"1,2,3,4"不是拼写错误?


相关: C#Decimal.Parse问题用逗号

.net c# floating-point int parsing

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

在Android Studio中创建Kotlin库

我对Android和JVM平台都很陌生.使用Android Studio,我想创建一个Android应用程序,并将我的大多数业务逻辑放在库中.我也想使用Kotlin,没有Java.

当我转到File>时New Module,列出的选项是

  • 手机和平板电脑模块
  • Android库
  • 即时应用
  • 功能模块
  • Android Wear模块
  • Android电视模块
  • Android事物模块
  • 导入Gradle项目
  • 导入Eclipse ADT项目
  • 导入.JAR/.AAR包
  • Java库

我可以使用该Android Library选项创建一个基于Kotlin的库,但是这也包含许多用于处理资源和控件的文件.

我只想要一个纯粹的Kotlin库.创建一个最简单的方法是什么?

  • 我可以删除Android库的一部分吗?
  • 我可以更改Java库中的某些设置吗?
  • 我可以下载一个插件,它只是给我创建一个Kotlin库的选项吗?

我仍然对Java/Kotlin/Android项目中的文件组织感到困惑.

android kotlin android-studio

24
推荐指数
1
解决办法
9002
查看次数

为什么 Visual Studio 2019 不会运行我的单元测试?

我在 VS2019 中看到 NUnit 测试的一些非常奇怪的行为,其中相同的解决方案在 VS2017 中运行良好。我的灵魂中有几个 NUnit 测试项目。

在安装了 NUnit Runner 扩展的 VS2017 中,我可以在“测试资源管理器”窗口中看到我的所有测试,并且“全部运行”按钮将起作用并运行所有测试。我组织中的一些开发人员使用 Resharper 而不是 NUnit 扩展,这也有效。

我已经停止使用 Resharper,因为随着 VS 引入更多功能,Resharper 使它变得如此缓慢,以至于 VS 无法使用。

在 VS2019 中,测试资源管理器窗口将显示我的所有单元测试(即使没有安装 NUnit 扩展)。如果我单击“全部运行”,它将不会运行任何测试,并且“输出”窗口将显示发现 0 个测试。同事们表示,Resharper 将毫无问题地运行所有测试。如果我右键单击单个测试项目并仅运行这些测试,则某些项目将运行测试,但不是全部。

对于某些项目,我尝试安装 NUnit3TestAdapater nuget 包,如果仅选择了该项目,这将使 VS2019 运行该项目的测试。这不适用于所有项目,它仍然不适用于“全部运行”。

有谁知道什么可能导致这种情况以及什么可以解决它?我已经为所有这些项目更新到最新版本的 NUnit (3.12) 和最新的 TestAdapter (3.16)。

大约一年以来,这真的很痛苦,因为我需要同时安装 VS2017 和 2019,而且我需要培训新开发人员如何解决这个奇怪的问题。

nunit visual-studio

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

与VS2015相关的所有这些后台进程是什么?我可以禁用哪些?

我的日常工作量要求我拥有Outlook,Excel,Firefox和IE(适用于与所有浏览器不兼容的不同网络应用程序),Skype以及一些其他几乎一直运行的程序.所有这些程序都是无情的内存/线程生成器,其中一些是32位版本,这使事情变得更糟.

除此之外,我也经常使用VS2015,它产生了背景流程,就像没有明天一样.

以下是任务管理器中当前列出的与VS2015相关的进程:

  • conhost.exe - 这个的几个实例总是在运行.如果我杀了这些,两个总会回来,但他们不会消耗大量资源
  • devenv.exe - 我知道这是主要的IDE进程,但为什么它在700MB的RAM和45个线程上空闲.
  • Microsoft.VsHub.Server.HttpHost.exe并且Microsoft.VsHub.Server.HttpHost64.exe- 不知道这些是做什么的,他们每个平均大约100MB RAM和几十个线程闲置.如果我杀了他们,他们会回来.
  • msvsmon.exe - 基于它的位置与调试器有关,但为什么它在我不处于调试模式时运行?如果我杀了它,我收到一条错误消息,它会立即返回.
  • VsHub.exe - 不确定它是什么,而不是太耗费资源.如果我杀了它,它需要两个"Microsfot.VsHub ..."过程,但它们都会在一分钟后回来.
  • MSBuild.exe - 我知道这是构建引擎.当我运行构建时,这些进程中最多有4个启动并且它们保持活动状态,每块大约40MB的RAM闲置.
  • ScriptedSandbox64.exe - 不确定这是什么,但我杀了它它会一直停留,直到我运行构建,然后它继续闲置40MB的RAM.
  • VBCSCompiler.exe - 我相信这是罗斯林.如果我杀了它,它会一直存在,直到我构建,然后它就会闲置大约100MB的RAM.

问题

  • 这些过程是什么?
  • 我可以避免运行这些吗?
  • 我可以防止它们在不使用时保持活力?
  • 怎么样?

visual-studio-2015

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

在 Docker 中安装 Rust 工具链时,Bash `source` 命令不起作用

我正在尝试创建一个 docker 镜像,它将设置一个用于构建 Rust 项目的 Linux 环境。这是我Dockerfile到目前为止:

FROM ubuntu:16.04

# Update default packages
RUN apt-get update

# Get Ubuntu packages
RUN apt-get install -y \
    build-essential \
    curl

# Update new packages
RUN apt-get update

# Get Rust
RUN curl https://sh.rustup.rs -sSf | bash -s -- -y
Run Code Online (Sandbox Code Playgroud)

我需要做的最后一件事是配置 Rust,以便我可以使用cargo. 文档说要使用

source $HOME/.cargo/env
Run Code Online (Sandbox Code Playgroud)

但是当我RUN在 Dockerfile中的命令中尝试时,它说source无法识别。我发现的另一个选择是使用

RUN /bin/bash -c "source ~/.cargo/env"
Run Code Online (Sandbox Code Playgroud)

这不会出错,但是当我运行我的容器时,cargo它不是一个可识别的命令。

当我打开容器时,这两种方法都适用于 Bash,但我希望将其作为图像的一部分自动执行。

如何将其集成到我的 Dockerfile 中?

linux bash docker

16
推荐指数
2
解决办法
7727
查看次数

是否存在类似(值OR错误)区分联合的.NET类型?

在C#中,我希望能够以更"功能"的方式处理错误,而不是总是使用默认的异常抛出模型.在某些情况下,投掷模型很棒,因为它允许您强制代码在发生意外情况时停止执行.但是,投掷模型有几个主要缺点:

  1. 异常抛出基本上是一个颠覆主控制流系统的应用控制流的整个二级系统.当一个方法被调用时,它的主体被执行,然后有效地控制返回给调用者,无论它是由于a return还是throw语句.如果控制从throw语句返回给调用者,如果没有适当的try/ catch在范围内,控件将立即移动到其调用者; 而如果控制权从一个return陈述中返回,则控制权继续正常进行.我知道实现方式比这更复杂和微妙,但我认为这是一个恰当的概念性总结.在设计时和运行时,这种双系统通常会以不同的方式混淆.
  2. 投掷系统在并行或异步场景中变得更加笨拙,正如在错误处理中看到的那样System.Threading.Tasks.Task.Task执行抛出的任何异常都存储在一个并由调用代码AggregateException通过Task.Exception属性访问.因此,当Tasks执行可能被中止时,调用代码必须使用正常的C#控制流来查找存储在对象属性中的错误.
  3. 除了XML注释之外,没有关于方法是否可能抛出异常或者可能抛出异常的元数据.异常表现为方法输出的替代形式,但在类型系统中很大程度上被忽略.例如,该方法int Divide(int x, int y)可能导致整数或a DivideByZeroException,但此方法的签名不建议任何有关错误的内容.相反,我经常听到有关Java检查异常的抱怨,其中一个方法可以抛出的每个特定异常类型必须添加到其签名中,这可能变得非常冗长.对我来说,最简单的中间地点是泛型类型Nullable<T>,包含值或异常.这样的方法Divide会有这个签名:Fallible<int> Divide(int x, int y).然后,使用该结果的任何操作都需要处理错误情况.方法也可以采用Fallible参数来更容易链接.

这是Fallible我概述的一个实现:

public class Fallible<T> : IEquatable<Fallible<T>> {

    #region Constructors

    public Fallible() {
        //value defaults to default(T)
        //exception defaults to null
    }

    public Fallible(T value) : this() {
        this.value = value;
    } …
Run Code Online (Sandbox Code Playgroud)

.net c# f# functional-programming exception-handling

10
推荐指数
1
解决办法
762
查看次数

Docker将文件从dockerfile复制到主机

我正在写一个Dockerfile构建应用程序.我知道您可以手动将文件从容器中复制出来

docker cp <containerId>:/file/path/within/container /host/path/target
Run Code Online (Sandbox Code Playgroud)

(请参阅将文件从Docker容器复制到主机),但我想运行

docker build
Run Code Online (Sandbox Code Playgroud)

并让它将我的Dockerfile某个地方创建的构建工件转储到我的主机文件系统上.

我可以在Dockerfile中使用一个命令来复制出容器并进入主机吗?喜欢相反的COPY

docker

9
推荐指数
2
解决办法
3362
查看次数

在新的 GitHub Desktop Beta 中,如何比较两个分支?

我目前正在使用 GitHub Desktop Beta 0.8.0。与之前的提交相比,我可以很容易地看到一次提交的差异,但我想查看我的分支与其基础分支之间的总差异。此功能是否已在 GitHub Desktop Beta 中实现?如果是这样,我该怎么做?官方文档似乎仍然适用于旧的 GitHub Desktop,而不是 2017 Beta。

github github-desktop

8
推荐指数
1
解决办法
3771
查看次数

有没有一种简单的方法可以将多个项目添加到解决方案中?

在某些解决方案中,我在开发过程中使用对内部项目的直接引用,并切换到 nuget 引用进行发布。然而,手动将 30 多个项目添加到新解决方案是一项繁琐的任务。

我想知道是否有更快的方法来做到这一点。对于项目来说,这非常容易,因为您只需复制/粘贴 xml,但解决方案文件并不那么容易编辑,但也许有一些技巧?

c# solution visual-studio sln-file

7
推荐指数
1
解决办法
1178
查看次数