小编Ack*_*ari的帖子

防止项目被发现为测试项目

我有几个项目的通用实用程序项目,其中包含一些基本测试类、帮助程序类等。项目定义如下所示:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup Label="Globals">
    <SccProjectName>SAK</SccProjectName>
    <SccProvider>SAK</SccProvider>
    <SccAuxPath>SAK</SccAuxPath>
    <SccLocalPath>SAK</SccLocalPath>
  </PropertyGroup>

  <PropertyGroup>
    <TargetFrameworks>net461;netstandard2.0</TargetFrameworks>
    <RootNamespace>SomeRoot.Util</RootNamespace>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="FluentAssertions" Version="5.10.2" />
    <PackageReference Include="xunit" Version="2.4.1" />
  </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

我假设由于它引用了 xUnit,因此 Visual Studio 和命令都dotnet test将其视为测试项目。但由于它不是,我想以某种方式阻止视觉工作室,并且dotnet test不将该项目识别为测试项目。

删除对 xUnit 的引用不是一个选项,因为基类需要 xUnit 包中的一些接口。

c# xunit ms-project visual-studio

9
推荐指数
1
解决办法
2955
查看次数

为什么没有 IAwaitable 和 IAwaiter 接口

我最近了解了自定义可等待类型的可能性,正如这个问题和Stephen Toub所说,要成为可等待类型有几个要求。

所以如果一个类型T想要等待它必须

  • 公开一个GetAwaiter返回有效等待者的无参数方法

如果一个类型A想成为一个有效的等待者,它必须

  • 实现INotifyCompletion接口
  • 提供一个名为的布尔属性 IsCompleted
  • 提供一个无参数的GetResult方法,返回voidTResult

所以现在我要问的是,如果所有这些都需要成为可等待类型,为什么某些接口的那部分不是像

public interface INotifyCompletion
{
    bool IsCompleted { get; }
    void OnCompleted(Action continuation);
}

public interface IAwaiter : INotifyCompletion
{
    void GetResult();
}

public interface IAwaitable<TAwaiter> where TAwaiter : IAwaiter
{
    TAwaiter GetAwaiter();
}

public interface IAwaiter<TResult> : INotifyCompletion
{
    TResult GetResult();
}

// this would probably not necessary but …
Run Code Online (Sandbox Code Playgroud)

c# language-design async-await

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

单个 LINQ 中两个结构不兼容的初始化出错

我有一个下面的模型,当我使用下面的 linq 添加 ComboProducts 对象时,出现错误。这段代码中我缺少什么吗?

错误

出现在单个 LINQ to Entities 查询中的两个结构不兼容的初始化中。一个类型可以在同一个查询的两个地方初始化,但前提是在两个地方设置了相同的属性,并且这些属性的设置顺序相同。

模型

public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public List<Product> ComboProducts { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

代码

public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public List<Product> ComboProducts { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

c# linq entity-framework

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

为什么 nunit 不运行包含控制/特殊字符的测试

如果我有一个像这样的测试课

public class Tests
{
    [TestCaseSource(nameof(TestSource))]
    public void Test(string c)
    {
        Assert.Pass();
    }

    public static IEnumerable<object> TestSource()
    {
        for (char c = '\0'; c < 255; c++)
        {
            yield return c.ToString();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

那么 Visual Studio 中的测试运行程序可以发现所有测试,但不会运行所有测试。

这些是未运行的 ASCII 字符范围:

U_0001 - U_0006
U_000E - U_001F
U_007F - U_0084
U_0086 - U_009F
Run Code Online (Sandbox Code Playgroud)

我们目前使用其中一些字符,例如U_0002网络工作相关测试,这些字符包含在测试中,但目前不运行

这是测试运行的输出

---------- Starting test discovery for requested test run ----------
NUnit Adapter 3.17.0.0: Test discovery starting
NUnit Adapter 3.17.0.0: Test discovery complete
========== Test …
Run Code Online (Sandbox Code Playgroud)

c# special-characters nunit-3.0

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

如何处理第三方代码中的死锁

我们有一个第三方方法Foo,有时会因未知原因而陷入死锁。

我们正在执行一个单线程 tcp 服务器,并每 30 秒调用此方法来检查外部系统是否可用。

为了缓解第三方代码中的死锁问题,我们将 ping 调用放在Task.Runto 中,以便服务器不会死锁。

喜欢

async Task<bool> WrappedFoo()
{
    var timeout = 10000; 

    var task = Task.Run(() => ThirdPartyCode.Foo());
    var delay = Task.Delay(timeout);

    if (delay == await Task.WhenAny(delay, task ))
    {
        return false;
    }
    else
    {
        return await task ;
    }
}
Run Code Online (Sandbox Code Playgroud)

但这(在我们看来)有可能导致空闲线程的应用程序匮乏。因为如果一次调用ThirdPartyCode.Foo死锁,线程将永远无法从死锁中恢复,如果这种情况发生得足够频繁,我们可能会耗尽资源。

是否有一种通用方法应该如何处理死锁的第三方代码?

ACancellationToken不起作用,因为第三方 api 不提供任何取消选项。

更新: 手头的方法来自SAP提供的SAPNCO.dll,用于建立和测试与sap系统的rfc连接,因此该方法不是简单的网络ping。我重命名了问题中的方法以避免进一步的误解

c# deadlock .net-5

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

为什么按位左移将 uint8_t 提升为更宽的类型

我有点搞砸了uint8_t,很好奇当我向左流出位并发现时会发生什么

uint8_t i = 234;

uint8_t j = (i << 1);
auto    k = (i << 1);

std::cout << (int)j << std::endl;

std::cout << k << std::endl;
Run Code Online (Sandbox Code Playgroud)

打印出来

212
468
Run Code Online (Sandbox Code Playgroud)

而不是预期的

212
212
Run Code Online (Sandbox Code Playgroud)

似乎<<确实促进了uint8_t一些更广泛的整数类型。它为什么这样做?

是一个链接,您可以在其中看到它的实际效果

c++ bit-shift uint8t

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

为什么 object.ToString 的签名声明它可以返回 null 值

我在项目中启用可为空功能时遇到了这个问题。

在 Net 5.0 中,签名object.ToString()

public virtual string? ToString ();
Run Code Online (Sandbox Code Playgroud)

这是为什么?给继承者的注释甚至指出

您的 ToString() 重写不应返回空或空字符串。

那么为什么签名说可以呢?我找不到任何相关信息。

但我的想法是

  • 对于那些没有阅读上述注释并从 ToString 方法返回 null 的人来说,具有向后可比性。
  • 让阅读该注释的人忽略它

但由于我们希望将可空特性附带的警告视为错误,所以现在我们必须!在使用的任何地方添加或空检查ToString

签名之所以如此,还有其他充分的理由吗?

c# nullable nullable-reference-types

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

C# 日期时间插入 SQL Server 值,精确到微秒

我将 .Net Core 2.2 与实体框架一起使用。我需要将一些数据插入 SQL Server。

在 C# 中我使用DateTime数据类型,在 SQL Server 中我使用datetime2(6)- 默认值为:(sysdatetime())

例如我的对象看起来像:

public partial class Contact
{
    public int Id { get; set; } 
    public string Name { get; set; } 
    public DateTime CreatedTime { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

如果我在创建对象时将 CreatedTime 保留为空,并让 SQL Server 使用默认值 (sysdatetime()),我将在数据库中得到类似以下内容的信息: 2020-05-19 09:31:12.383593 。

据我了解,DateTime 数据类型本身已经具有微秒精度,但是,如果我为 CreatedTime 属性设置一个值,例如:

obj.CreatedTime = DateTime.Now.AddTicks(123);
Console.WriteLine(obj.CreatedTime.ToString("yyyy-MM-dd HH:mm:ss.ffffff"));
Run Code Online (Sandbox Code Playgroud)

我可以在控制台中看到该值,它将是2020-08-18 07:42:52.131102。但是,当通过 EntityFramwork 插入该 obj 时,数据库中的值将仅为毫秒:2020-08-18 07:42:52.131000。看起来 EntityFramework 不知何故只以毫秒精确度传递 …

c# sql-server datetime entity-framework

2
推荐指数
1
解决办法
743
查看次数

使用 Task.Delay 延迟 24 小时是否安全

Task.Delay()每天在循环中延迟 24 小时运行代码是否安全?我的代码是:

while (!token.IsCancellationRequested) 
{
    await Task.Delay(TimeSpan.FromDays(1), token);
    await DoStuff(token);
}
Run Code Online (Sandbox Code Playgroud)

Task.Delay()以这种方式使用安全吗?

c# async-await

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