我有几个项目的通用实用程序项目,其中包含一些基本测试类、帮助程序类等。项目定义如下所示:
<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 包中的一些接口。
我最近了解了自定义可等待类型的可能性,正如这个问题和Stephen Toub所说,要成为可等待类型有几个要求。
所以如果一个类型T想要等待它必须
GetAwaiter返回有效等待者的无参数方法如果一个类型A想成为一个有效的等待者,它必须
INotifyCompletion接口IsCompletedGetResult方法,返回void或TResult所以现在我要问的是,如果所有这些都需要成为可等待类型,为什么某些接口的那部分不是像
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) 我有一个下面的模型,当我使用下面的 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) 如果我有一个像这样的测试课
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) 我们有一个第三方方法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。我重命名了问题中的方法以避免进一步的误解
我有点搞砸了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一些更广泛的整数类型。它为什么这样做?
这是一个链接,您可以在其中看到它的实际效果
我在项目中启用可为空功能时遇到了这个问题。
在 Net 5.0 中,签名object.ToString()是
public virtual string? ToString ();
Run Code Online (Sandbox Code Playgroud)
这是为什么?给继承者的注释甚至指出
您的 ToString() 重写不应返回空或空字符串。
那么为什么签名说可以呢?我找不到任何相关信息。
但我的想法是
但由于我们希望将可空特性附带的警告视为错误,所以现在我们必须!在使用的任何地方添加或空检查ToString。
签名之所以如此,还有其他充分的理由吗?
我将 .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 不知何故只以毫秒精确度传递 …
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# ×8
async-await ×2
.net-5 ×1
bit-shift ×1
c++ ×1
datetime ×1
deadlock ×1
linq ×1
ms-project ×1
nullable ×1
nunit-3.0 ×1
sql-server ×1
uint8t ×1
xunit ×1