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#中:
抛出一个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"不是拼写错误?
我对Android和JVM平台都很陌生.使用Android Studio,我想创建一个Android应用程序,并将我的大多数业务逻辑放在库中.我也想使用Kotlin,没有Java.
当我转到File>时New Module,列出的选项是
我可以使用该Android Library选项创建一个基于Kotlin的库,但是这也包含许多用于处理资源和控件的文件.
我只想要一个纯粹的Kotlin库.创建一个最简单的方法是什么?
我仍然对Java/Kotlin/Android项目中的文件组织感到困惑.
我在 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,而且我需要培训新开发人员如何解决这个奇怪的问题。
我的日常工作量要求我拥有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.我正在尝试创建一个 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 中?
在C#中,我希望能够以更"功能"的方式处理错误,而不是总是使用默认的异常抛出模型.在某些情况下,投掷模型很棒,因为它允许您强制代码在发生意外情况时停止执行.但是,投掷模型有几个主要缺点:
return还是throw语句.如果控制从throw语句返回给调用者,如果没有适当的try/ catch在范围内,控件将立即移动到其调用者; 而如果控制权从一个return陈述中返回,则控制权继续正常进行.我知道实现方式比这更复杂和微妙,但我认为这是一个恰当的概念性总结.在设计时和运行时,这种双系统通常会以不同的方式混淆.System.Threading.Tasks.Task.Task执行抛出的任何异常都存储在一个并由调用代码AggregateException通过Task.Exception属性访问.因此,当Tasks执行可能被中止时,调用代码必须使用正常的C#控制流来查找存储在对象属性中的错误.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) 我正在写一个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?
我目前正在使用 GitHub Desktop Beta 0.8.0。与之前的提交相比,我可以很容易地看到一次提交的差异,但我想查看我的分支与其基础分支之间的总差异。此功能是否已在 GitHub Desktop Beta 中实现?如果是这样,我该怎么做?官方文档似乎仍然适用于旧的 GitHub Desktop,而不是 2017 Beta。
在某些解决方案中,我在开发过程中使用对内部项目的直接引用,并切换到 nuget 引用进行发布。然而,手动将 30 多个项目添加到新解决方案是一项繁琐的任务。
我想知道是否有更快的方法来做到这一点。对于项目来说,这非常容易,因为您只需复制/粘贴 xml,但解决方案文件并不那么容易编辑,但也许有一些技巧?