我正在尝试在 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>();
过同样的结果。
我一直使用私有和公共方法.但是,我不明白他们为什么工作.创建一个小型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如何区分并验证遵守私人/公共规则?
假设我有两条记录,都有日期和计数:
--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 循环来完成,但我希望这可以更容易地完成。
我正在使用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分钟.
假设我们有以下型号:
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) 假设我有一个游戏对象“玩家”和两个场景 A 和 B。如果我在两个场景上添加这个游戏对象“玩家”,然后进行一些更改(例如在场景 A 中添加脚本),我可以以某种方式实现游戏对象“ A 和 B 中的 Player' 保持不变?或者我是否必须手动更新两个场景中的游戏对象?
我找不到方便的方法来实现这一目标。
我创建了一个 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)
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) 选择什么:Cast
或Convert
日期时间(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标准,这使得它更便于携带防空火炮不同的数据库平台.
也许这听起来很奇怪,但想法是定义一个类,比如说LargeString
,它就像一个字符串,除了它不应该通过调用'+ ='运算符创建一个新的引用.
所以我可以将它LargeString
用于Concatenations,而不是StringBuilder
-Class.
这应该是这样的:
LargeString s1 = "someLongString1";
LargeString s2 = "someLongString2";
LargeString s3 = s1 + s2;
s3 += "someLongString3"
Run Code Online (Sandbox Code Playgroud)
然后最后一行不应该创建新的引用.这是否可以通过可重载的运算符或其他技巧实现?
注意:我知道我可以通过创建一个具有本地
Stringbuilder成员的类来轻松实现这一点,但我真的希望找到一种更美观的方式.
如您所知,如果我们选择两个表而我们具有相同的列名,则会收到错误:
'不明确的列名'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可解决问题.
c# ×7
sql ×3
sql-server ×2
string ×2
.net ×1
asp.net ×1
caching ×1
date ×1
gameobject ×1
iis ×1
javascript ×1
optimization ×1
performance ×1
regex ×1