小编Fab*_*ler的帖子

如何在控制器中解析 HostedService

我正在尝试在 ASP.NET Core 3.0 中添加一个后台计时器,它会定期执行一个任务。谷歌把我带到了这里,在那里我实现了“定时后台任务”。但是,我一直在解决控制器中的 HostedService 问题。我需要 TimedHealthCheckService 的特定实例,以便我可以调用另一个名为“GetAvailableODataUrl()”的公共函数。


startup.cs我使用以下代码:

services.AddHostedService<TimedHealthCheckService>();
Run Code Online (Sandbox Code Playgroud)

TimedHealthCheckService 显然实现了 IHostedService:

public class TimedHealthCheckService : IHostedService, IDisposable                  
Run Code Online (Sandbox Code Playgroud)

在我的控制器中,我有以下构造函数:

public HealthCheckController(ILogger<HealthCheckController> logger, IHostedService hostedService)
{
  this.logger = logger;
  this.timedHealthCheckService = hostedService as TimedHealthCheckService;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我启动 WebAPI 时,timedHealthCheckService它始终为空。似乎另一个 IHostedService 被注入到构造函数中。通过检查hostedService,它实际上是一个GenericWebHostService类型的对象。

如果我将控制器的构造函数更改为:

public HealthCheckController(ILogger<HealthCheckController> logger, TimedHealthCheckService hostedService)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

尝试激活“HealthCheck.Web.Controllers.HealthCheckController”时无法解析“HealthCheck.Web.TimedHealthCheckService”类型的服务。

我也尝试services.AddSingleton<IHostedService, TimedHealthCheckService>();过同样的结果。

c# asp.net-core-3.0

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

C#如何验证C#私有定义?

我一直使用私有和公共方法.但是,我不明白他们为什么工作.创建一个小型Hello World程序:

public class CallPublicHelloWorld
{
    public void CallHelloWorld()
    {
        publicHelloWorld();
        privateHelloWorld();
    }

    private void privateHelloWorld()
    {
        Console.WriteLine("Hello World");
    }

    public void publicHelloWorld()
    {
        Console.WriteLine("Hello World");
    }
}
Run Code Online (Sandbox Code Playgroud)

IL为公共方法创建:

IL_0000:  nop
IL_0001:  ldstr      "Hello World"
IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
IL_000b:  nop
IL_000c:  ret
Run Code Online (Sandbox Code Playgroud)

IL为私有方法创建:

IL_0000:  nop
IL_0001:  ldstr      "Hello World"
IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
IL_000b:  nop
IL_000c:  ret
Run Code Online (Sandbox Code Playgroud)

它完全相同.

JIT如何区分并验证遵守私人/公共规则?

.net c# compiler-construction visual-studio

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

什么更快:正则表达式或字符串操作?

什么时候我应该使用Regex而不是字符串操作,反之亦然只考虑性能?

c# regex string performance

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

如何填补空白?

假设我有两条记录,都有日期和计数:

--Date--                   --Count--
2011-09-20 00:00:00        5
2011-09-16 00:00:00        8
Run Code Online (Sandbox Code Playgroud)

您将如何选择它来填补时间间隙,始终采用最后一条记录?

所以输出将是:

--Date--                   --Count--
2011-09-20 00:00:00        5
2011-09-19 00:00:00        8
2011-09-18 00:00:00        8
2011-09-17 00:00:00        8
2011-09-16 00:00:00        8
Run Code Online (Sandbox Code Playgroud)

我还无法找到一个巧妙的解决方案。我想这可以通过 DATEDIFF 和 for 循环来完成,但我希望这可以更容易地完成。

sql sql-server-2005 date

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

缓存过期未按预期工作

我正在使用HttpContext.Current.Cache来缓存带有CacheItemUpdateCallback的昂贵数据查询.

这个想法是用户必须加载一次数据,然后updatecallback每30分钟更新一次对象.

这是我插入/覆盖缓存的方式:

HttpContext.Current.Cache.Insert(cacheID, cachedObject, null,
                                  expiryTimeStamp,
                                  Cache.NoSlidingExpiration,
                                  updateCallBack);   
Run Code Online (Sandbox Code Playgroud)

出于测试原因,我设置了这样的到期日期(每20秒更新一次):

var expiryTimeStamp = DateTime.Now.Add(new TimeSpan(0, 0, 20));
Run Code Online (Sandbox Code Playgroud)

一切正常.这意味着,它每20秒更新一次昂贵的物品 - 但只需要大约25分钟.然后不再调用触发器'updateCallBack'!

我想问题是IIS处理缓存所以回调'CacheItemUpdateCallBack'不再被触发......但这只是猜测.

这引出了我的问题:

我是否需要在app.config或IIS中设置任何设置?或者我做错了什么?

编辑: 此外,我不明白为什么带有CacheItemUpdateCallback 的Insert重载没有参数CacheItemPriority.但是,CacheItemRemovedCallback重载确实具有优先级参数.也许,如果我可以将CacheItemPriority设置为"高",它就已经解决了我的问题.

编辑:我发现了问题:每个应用程序池都有一个空闲超时属性,设置为20分钟.

c# asp.net iis caching

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

C#或JIT编译器是否足够智能来处理这个问题?

假设我们有以下型号:

public class Father
{
    public Child Child { get; set; }
    public string Name { get; set; }

    public Father() { }
}

public class Child
{
    public Father Father;
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以下实施:

var father = new Father();
father.Name = "Brad";
var child = new Child();
child.Father = father;
child.Name = "Brian";
father.Child = child;
Run Code Online (Sandbox Code Playgroud)

现在我的问题是:codesnippet#1相当于codesnippet#2吗?

或者运行codenippet#1需要更长的时间吗?

CodeSnippet#1:

var fatherName = father.Child.Father.Child.Father.Child.Name;
Run Code Online (Sandbox Code Playgroud)

CodeSnippet#2:

var fatherName = father.Name;
Run Code Online (Sandbox Code Playgroud)

c# compiler-construction optimization

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

在场景之间共享游戏对象

假设我有一个游戏对象“玩家”和两个场景 A 和 B。如果我在两个场景上添加这个游戏对象“玩家”,然后进行一些更改(例如在场景 A 中添加脚本),我可以以某种方式实现游戏对象“ A 和 B 中的 Player' 保持不变?或者我是否必须手动更新两个场景中的游戏对象?

我找不到方便的方法来实现这一目标。

unity-game-engine gameobject

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

从 Blazor 调用 JavaScript:如何在 DotNetObjectReference 中处理 JavaScript?

我创建了一个 Blazor Web assembly 项目,并在 JavaScript 中添加了一个关键侦听器,该侦听器侦听 DOM 文档上的每个击键。一切都按预期进行,但是当我打开注册了密钥侦听器的 Blazor 页面并稍后再次打开它时,Web 浏览器中会出现以下错误:

没有 ID 为“2”的跟踪对象。也许 DotNetObjectReference 实例已经被释放。(参数“dotNetObjectId”)

显然,对象“dotnethelper”已被释放,但 Javascript 仍在侦听/被调用。

基本上,我实现了Microsoft 文档中的“组件实例 .NET 方法帮助器类” 。

开拓者页面:

注意:IDisposable 被注入到顶部,并且 Dispose 函数被调用。

@code {
    private KeyListenerInvokeHelper _keyListenerInvokeHelper;
    private DotNetObjectReference<KeyListenerInvokeHelper>? objRef;

    protected override async Task OnInitializedAsync()
    {
        objRef = DotNetObjectReference.Create(_keyListenerInvokeHelper);
        await JS.InvokeVoidAsync("initializeKeyListener", objRef);    
    }

    public void Dispose()
    {
        objRef?.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

JavaScript 文件:

window.initializeKeyListener = (dotnetHelper) => {
    document.addEventListener('keydown', logKey);
    function logKey(e) {     
        dotnetHelper.invokeMethod('OnKeyDown', e.key);
        console.log('key down ' + e.key); …
Run Code Online (Sandbox Code Playgroud)

javascript c# blazor-webassembly

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

datetime Cast或Convert?

选择什么:CastConvert日期时间(Microsoft SQL Server)?


我看过MSDN规范.乍一看似乎除了语法之外没有区别:

CAST的语法:

CAST ( expression AS data_type [ ( length ) ] )
Run Code Online (Sandbox Code Playgroud)

CONVERT的语法:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
Run Code Online (Sandbox Code Playgroud)

CAST是ANSI标准,这使得它更便于携带防空火炮不同的数据库平台.

sql sql-server

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

为大字符串标识自己的字符串对象?

也许这听起来很奇怪,但想法是定义一个类,比如说LargeString,它就像一个字符串,除了它不应该通过调用'+ ='运算符创建一个新的引用.

所以我可以将它LargeString用于Concatenations,而不是StringBuilder-Class.

这应该是这样的:

LargeString s1 = "someLongString1";
LargeString s2 = "someLongString2";
LargeString s3 = s1 + s2;
s3 += "someLongString3"
Run Code Online (Sandbox Code Playgroud)

然后最后一行不应该创建新的引用.这是否可以通过可重载的运算符或其他技巧实现?

注意:我知道我可以通过创建一个具有本地
Stringbuilder成员的类来轻松实现这一点,但我真的希望找到一种更美观的方式.

c# string

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

模糊列名称:为什么在某些情况下它不明确?

如您所知,如果我们选择两个表而我们具有相同的列名,则会收到错误:

'不明确的列名'ColumnName''

我已经知道设置别名确实解决了这个问题.

但是,似乎列的名称不在 SELECT语句中,那么它适用于SQL Server 2008 R2(在我的数据库中).兼容级别设置为100.

所以下面的陈述是有效的:

SELECT t1.ID
FROM Table1 t1 
JOIN Table2 t2 ON (t2.ID = t1.ID) 
ORDER BY ID
Run Code Online (Sandbox Code Playgroud)

但显然在其他情况下,上述声明确实会返回错误(我知道这是因为它发生在客户的网站上).同样在SQL Fiddle上,它在SQL Server 2008和SQL Server 2012上都返回错误.

有人知道为什么在什么情况下上面的查询仍然返回错误?

我的猜测是SQL Server上的版本或设置问题.

注意:链接的副本确实解决了我的问题.兼容级别设置为80.将其更改为100可解决问题.

sql sql-server

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