小编Avr*_*oel的帖子

为什么不调用这个C#4.0异步方法?

我正在尝试写一个非常简单的异步代码.我有一个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)

c# action asynchronous begininvoke

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

如何告诉 Visual Studio 将 WinMerge 与 Git 结合使用?

我在 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)

git winmerge visual-studio

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

为什么我不能更改Rhino Mocks存根对象的返回值?

如果这是一个愚蠢的问题,请原谅我,但我在嘲笑方面相当新,我正试图解决它.

我有一些单元测试(使用内置的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属性以返回"无效",但它仍然返回默认的电子邮件地址.这导致我的测试失败,因为我期望它抛出异常,但事实并非如此.

任何人都知道为什么我不能改变这个属性的返回值?

谢谢你的帮助.

c# unit-testing rhino-mocks mocking stub

4
推荐指数
2
解决办法
2186
查看次数

如何对使用DbContext和NSubstitute的存储库进行单元测试?

我有一个解决方案,其中我有一个数据项目,其中包含从现有数据库生成的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)

c# unit-testing entity-framework nsubstitute dbcontext

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

如何允许我的 ASP.NET Core 标记助手自动关闭

我写了一个标签助手,我可以使用如下......

<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>.

如果我设置TagStructureNormalOrSelfClosing然后包含一个结束标记有效,但<mytaghelper attr1="jim"/>给出一个空的<div />

任何人都能够解释我需要做什么?

tag-helpers asp.net-core asp.net-core-tag-helpers

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

无法在泛型方法中将“Enum”值转换为“int”

如果我有一个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)

...但是编译器抱怨说它无法将类型转换Tint.

有人能向我解释一下吗?通用约束告诉编译器这T是一个enum,并且(除非您专门以不同的方式进行操作)enum可以将值转换为int

c# generics enums

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

在 Git 更改中键入“#nnn”时,Visual Studio 2022 不显示工作项

在 VS2019 中,当我在 Git Changes 消息框中键入内容时,如果我键入 #,后跟数字,它会显示匹配的工作项,并允许我选择一个。然后该工作项将与提交相关联。

VS2022 不这样做。输入 # 就像输入任何其他字符一样。

有没有办法恢复 VS2019 的行为?


刚刚发现我的一位同事有老行为。据我所知,我们都没有为此更改任何设置,但他获得了提供的工作项目,而我没有。

visual-studio visual-studio-2022

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

我们如何在单独的代码文件中创建可重用的RenderFragment?

这篇 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 表达式中的值(这很有趣,因为返回类型没有泛型类型) …

razor blazor

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

当我们了解数据结构时,是否有更有效的方法来压缩数字字符串?

我们有会员卡(类似于信用卡/借记卡,但由我们的定制代码处理,而不是通过与银行接口处理的卡)。我们需要在卡上存储交易数据,因为许多交易将使用离线设备进行,并且仅在下次在在线终端上点击该卡时才上传。

\n

卡存储空间如果有限(通常最大为 8Kb,除非您为非常智能的卡支付愚蠢的价格),所以我需要尽可能地压缩数据。

\n

我们的交易数据由三部分组成,所有部分都只涉及数字(即不涉及字母或特殊字符)...

\n
    \n
  • 日期/时间 - 格式yyMMddhhmmssfff
  • \n
  • 设备序列号 - 17 位数字
  • \n
  • 金额 - 以便士为单位,最大 \xc2\xa3999.99,即五位数字
  • \n
\n

如果将其表示为一串数字,则每笔交易有 37 个数字。

\n

我尝试使用System.IO.Compression(遵循本博客文章中的代码以及随附的 GitHub 存储库,未包含在此处,因为它是类的沼泽标准用法)中的算法。

\n

这给出了一些相当令人印象深刻的结果,使用最佳 Gzip 算法减少了大约 72%。

\n

然而,我想知道,鉴于我们对交易数据的形状有所了解,是否可以对此进行改进。例如,数据的日期/时间部分细分如下......

\n
    \n
  • 年份 - 这里没有太多限制
  • \n
  • 月份 - 只能是 1-12
  • \n
  • 天 - 只能是 1-31
  • \n
  • 小时 - 只能是 0-23
  • \n
  • 分钟和秒 - 只能是 0-59
  • \n
  • 毫秒 - 无限制
  • \n
\n

任何人对这些限制是否有助于我改进这种压缩发表评论。谢谢

\n

c# compression

4
推荐指数
2
解决办法
163
查看次数

如何在 ASP.NET Core 中间件中获取传入请求正文和传出响应正文?

我正在为 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# asp.net-core minimal-apis

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