我正在尝试写一个非常简单的异步代码.我有一个void方法,它不接受任何参数,这些参数是从Windows服务调用的.我想把它打开异步,这样服务就不必等待方法完成了.
我创建了一个非常简单的测试应用程序,以确保我正在编码正确,但异步方法只是没有被调用.任何人都能看到我做错了什么?我顺便使用.NET 4.0,所以我不能使用await(这会更简单!).
这是我的整个测试样本......
using System;
using System.Threading;
namespace AsyncCallback {
internal class Program {
private static void Main(string[] args) {
Console.WriteLine(DateTime.Now.ToLocalTime().ToLongTimeString() + " - About to ask for stuff to be done");
new Action(DoStuff).BeginInvoke(ar => StuffDone(), null);
Console.WriteLine(DateTime.Now.ToLocalTime().ToLongTimeString() + " - Asked for stuff to be done");
}
private static void StuffDone() {
Console.WriteLine(DateTime.Now.ToLocalTime().ToLongTimeString() + " - Stuff done");
}
private static void DoStuff() {
Console.WriteLine(DateTime.Now.ToLocalTime().ToLongTimeString() + " - Starting to do stuff");
Thread.Sleep(1000);
Console.WriteLine(DateTime.Now.ToLocalTime().ToLongTimeString() + " - Ending …Run Code Online (Sandbox Code Playgroud) 我在 VS2017 Enterprise 中使用 Git,如果我在 Changes 中右键单击一个文件并选择“与未修改的比较”,它将使用 VS diff 工具在 VS 中的新窗口中打开。
我想改用 WinMerge,并且一直在查看诸如this(BeyondCompare 的说明,但原理应该相同)、this(GitExtensions 同上)和this 之类的资源,但无法使其工作。无论我做什么,我仍然可以在 VS 中获得 VS diff 工具。
我的用户文件夹中的 .gitconfig 文件看起来像这样......
[user]
name = Me
email = myemail@somewhere.jim
[core]
autocrlf = true
[diff]
tool = winmerge
[difftool "winmerge"]
cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" -e "$LOCAL" "$REMOTE"
Run Code Online (Sandbox Code Playgroud)
...我的项目文件夹中的 .git/config 文件看起来像这样(敏感信息已更改)...
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[user]
[diff] …Run Code Online (Sandbox Code Playgroud) 如果这是一个愚蠢的问题,请原谅我,但我在嘲笑方面相当新,我正试图解决它.
我有一些单元测试(使用内置的Visual Studio 2010 Professional测试功能),它使用方法所需的存根.我创建了一个存根,并设置了几个属性和方法的默认返回值,一切运行良好.我有一个静态类来设置存根,这在TestInitialize方法中用于设置存根...
public static AppointmentReminderProviderInterface GetMockProvider() {
AppointmentReminderProviderInterface provider = MockRepository.GenerateStub<AppointmentReminderProviderInterface>();
provider.Stub(p => p.ContactName).Return(MockProviderContactName);
provider.Stub(p => p.ContactEmail).Return(MockProviderContactEmail);
return provider;
}
Run Code Online (Sandbox Code Playgroud)
请注意,MockProviderContactName并且MockProviderContactEmail是包含提供程序的默认数据的本地字符串属性.该单元检查以查看是否按照默认数据进行操作是否正常.
但是,我现在想测试当其中一个属性包含duff数据时会发生什么.我以为我可以在存根上设置它,但它不起作用.测试方法包含以下几行......
_provider.Stub(p => p.ContactEmail).Return("invalid");
Debug.WriteLine("Provider email: <" + _provider.ContactEmail + ">");
Run Code Online (Sandbox Code Playgroud)
这Debug.WriteLine()告诉我,尽管我已经设置了ContactEmail属性以返回"无效",但它仍然返回默认的电子邮件地址.这导致我的测试失败,因为我期望它抛出异常,但事实并非如此.
任何人都知道为什么我不能改变这个属性的返回值?
谢谢你的帮助.
我有一个解决方案,其中我有一个数据项目,其中包含从现有数据库生成的EF6 .edmx文件.我将实体拆分为一个单独的实体项目,并有一个引用它们的存储库项目.
我添加了一个带有一些常用方法的BaseRepository,并希望对它进行单元测试.班级的顶端看起来像这样......
public class BaseRepository<T> : BaseRepositoryInterface<T> where T : class {
private readonly MyEntities _ctx;
private readonly DbSet<T> _dbSet;
public BaseRepository(MyEntities ctx) {
_ctx = ctx;
_dbSet = _ctx.Set<T>();
}
public IEnumerable<T> GetAll() {
return _dbSet;
}
//...
}
Run Code Online (Sandbox Code Playgroud)
按照我在/sf/answers/1475226511/上找到的代码,我尝试了以下内容......
[TestMethod]
public void BaseRepository_GetAll() {
IDbSet<Patient> mockDbSet = Substitute.For<IDbSet<Patient>>();
mockDbSet.Provider.Returns(GetPatients().Provider);
mockDbSet.Expression.Returns(GetPatients().Expression);
mockDbSet.ElementType.Returns(GetPatients().ElementType);
mockDbSet.GetEnumerator().Returns(GetPatients().GetEnumerator());
MyEntities mockContext = Substitute.For<MyEntities>();
mockContext.Patients.Returns(mockDbSet);
BaseRepositoryInterface<Patient> patientsRepository
= new BaseRepository<Patient>(mockContext);
List<Patient> patients = patientsRepository.GetAll().ToList();
Assert.AreEqual(GetPatients().Count(), patients.Count);
}
private IQueryable<Patient> GetPatients() {
return new …Run Code Online (Sandbox Code Playgroud) 我写了一个标签助手,我可以使用如下......
<mytaghelper attr1="jim"></mytaghelper>
Run Code Online (Sandbox Code Playgroud)
我希望能够将其缩短为...
<mytaghelper attr1="jim">
Run Code Online (Sandbox Code Playgroud)
...或者至少...
<mytaghelper attr1="jim"/>
Run Code Online (Sandbox Code Playgroud)
但是,我无法让它发挥作用。这是 Process 方法的一些示例代码...
public override void Process(TagHelperContext context, TagHelperOutput output) {
output.TagName = "div";
output.PreContent.SetHtmlContent("<div>");
output.Content.SetHtmlContent("OUTPUT HTML GOES HERE");
output.PostContent.SetHtmlContent("</div>");
output.Attributes.Clear();
}
Run Code Online (Sandbox Code Playgroud)
我曾尝试向类上的属性添加TagStructure设置HtmlTargetElement...
[HtmlTargetElement("mytaghelper", TagStructure = TagStructure.WithoutEndTag)]
Run Code Online (Sandbox Code Playgroud)
……不过好像没什么区别。<mytaghelper attr1="jim"/>生成<div />并<mytaghelper attr1="jim"></mytaghelper>生成<div></mytaghelper>.
如果我设置TagStructure为NormalOrSelfClosing然后包含一个结束标记有效,但<mytaghelper attr1="jim"/>给出一个空的<div />
任何人都能够解释我需要做什么?
如果我有一个enum...
public enum Frequency {
OneOff = 0,
Monthly = 1,
Quarterly = 2,
Annually = 3
}
Run Code Online (Sandbox Code Playgroud)
...那么我可以做这样的事情...
int n = (int)Frequency.Annually;
Run Code Online (Sandbox Code Playgroud)
鉴于自 C# 7.3 以来,我们能够用作Enum通用约束,我希望能够做到这一点......
public void Stuff<T>(T val) where T : Enum {
int v = (int)val;
}
Run Code Online (Sandbox Code Playgroud)
...但是编译器抱怨说它无法将类型转换T为int.
有人能向我解释一下吗?通用约束告诉编译器这T是一个enum,并且(除非您专门以不同的方式进行操作)enum可以将值转换为int。
在 VS2019 中,当我在 Git Changes 消息框中键入内容时,如果我键入 #,后跟数字,它会显示匹配的工作项,并允许我选择一个。然后该工作项将与提交相关联。
VS2022 不这样做。输入 # 就像输入任何其他字符一样。
有没有办法恢复 VS2019 的行为?
刚刚发现我的一位同事有老行为。据我所知,我们都没有为此更改任何设置,但他获得了提供的工作项目,而我没有。
在这篇 Microsoft 文章中,他们展示了如何将一段 Blazor 代码提取到一个方法中,以便可以重用它。他们展示了以下示例...
<h1>Hello, world!</h1>
@RenderWelcomeInfo
<p>Render the welcome info a second time:</p>
@RenderWelcomeInfo
@code {
private RenderFragment RenderWelcomeInfo = __builder =>
{
<p>Welcome to your new app!</p>
};
}
Run Code Online (Sandbox Code Playgroud)
然后他们继续解释说,如果你想将此方法提取到一个单独的.razor文件中,你可以将其制作为static.
对于一个简单的示例(例如它们所显示的示例)来说,这一切都很好,但如果您想要任何实际的东西,那么您可能需要向该方法传递至少一个参数。
但是,如果您更改他们的SayHello示例以采用参数......
public static RenderFragment SayHelloName(string name) = __builder => {
<h1>Hello @name</h1>
};
Run Code Online (Sandbox Code Playgroud)
...然后你会得到一些有趣的编译器错误组合...
该=标志有红色下划线,将鼠标悬停在其上会出现错误Function body Expected
该变量__builder以红色突出显示,将鼠标悬停在其上会出现错误“无法解析符号”__builder
变量后面的空格__builder以红色突出显示,将鼠标悬停在其上会出现错误无法解析符号__builder\n\n意外的标记
有=>一个红色下划线,将鼠标悬停在上面会出现错误并非所有代码路径都返回“RenderFragment”类型的 lambda 表达式中的值(这很有趣,因为返回类型没有泛型类型) …
我们有会员卡(类似于信用卡/借记卡,但由我们的定制代码处理,而不是通过与银行接口处理的卡)。我们需要在卡上存储交易数据,因为许多交易将使用离线设备进行,并且仅在下次在在线终端上点击该卡时才上传。
\n卡存储空间如果有限(通常最大为 8Kb,除非您为非常智能的卡支付愚蠢的价格),所以我需要尽可能地压缩数据。
\n我们的交易数据由三部分组成,所有部分都只涉及数字(即不涉及字母或特殊字符)...
\nyyMMddhhmmssfff如果将其表示为一串数字,则每笔交易有 37 个数字。
\n我尝试使用System.IO.Compression(遵循本博客文章中的代码以及随附的 GitHub 存储库,未包含在此处,因为它是类的沼泽标准用法)中的算法。
这给出了一些相当令人印象深刻的结果,使用最佳 Gzip 算法减少了大约 72%。
\n然而,我想知道,鉴于我们对交易数据的形状有所了解,是否可以对此进行改进。例如,数据的日期/时间部分细分如下......
\n任何人对这些限制是否有助于我改进这种压缩发表评论。谢谢
\n我正在为 ASP.NET Core 7 最小 API 项目编写一些中间件。
在这个阶段,我只希望能够读取正在发送的请求正文,然后读取正在发送的响应正文,并将它们转储到控制台。
阅读请求似乎很容易。我的中间件包含以下内容...
public async Task InvokeAsync(HttpContext httpContext) {
try {
httpContext.Request.EnableBuffering();
string requestBody = await new StreamReader(httpContext.Request.Body, Encoding.UTF8).ReadToEndAsync();
httpContext.Request.Body.Position = 0;
Console.WriteLine($"Request body: {requestBody}");
} catch (Exception ex) {
Console.WriteLine($"Exception reading request: {ex.Message}");
}
await _next(httpContext);
}
Run Code Online (Sandbox Code Playgroud)
这很好用。但是,当我尝试读取响应正文时,出现异常。我尝试插入以下内容(类似于在许多 SO 答案和博客文章中找到的内容)...
try {
using StreamReader reader = new(httpContext.Response.Body);
httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
string responseBody = await reader.ReadToEndAsync();
httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
Console.WriteLine($"Response body: {responseBody}");
} catch (Exception ex) {
Console.WriteLine($"Exception reading response: {ex.Message}");
}
Run Code Online (Sandbox Code Playgroud)
但是,这会产生异常System.ArgumentException:Stream 不可读。
让我困惑的一件事是,根据 …
c# ×6
asp.net-core ×2
unit-testing ×2
action ×1
asynchronous ×1
begininvoke ×1
blazor ×1
compression ×1
dbcontext ×1
enums ×1
generics ×1
git ×1
minimal-apis ×1
mocking ×1
nsubstitute ×1
razor ×1
rhino-mocks ×1
stub ×1
tag-helpers ×1
winmerge ×1