我需要一种方法来设置异步任务,因为长时间运行而不使用Task.Factory.StartNew(...)而是使用Task.Run(...)或类似的东西.
语境:
我有连续循环的任务,直到它被外部取消,我想设置为'长时间运行'(即给它一个专用的线程).这可以通过以下代码实现:
var cts = new CancellationTokenSource();
Task t = Task.Factory.StartNew(
async () => {
while (true)
{
cts.Token.ThrowIfCancellationRequested();
try
{
"Running...".Dump();
await Task.Delay(500, cts.Token);
}
catch (TaskCanceledException ex) { }
} }, cts.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
Run Code Online (Sandbox Code Playgroud)
问题是Task.Factory.StartNew(...)不返回传入的活动异步任务,而是返回"运行Action的任务",其功能上始终具有taskTatus的'RanToCompletion'.由于我的代码需要能够跟踪任务的状态以查看它何时变为"已取消"(或"故障"),我需要使用以下内容:
var cts = new CancellationTokenSource();
Task t = Task.Run(
async () => {
while (true)
{
cts.Token.ThrowIfCancellationRequested();
try
{
"Running...".Dump();
await Task.Delay(500, cts.Token);
}
catch (TaskCanceledException ex) { }
} }, cts.Token);
Run Code Online (Sandbox Code Playgroud)
Task.Run(...),根据需要,返回异步过程本身,允许我获得'已取消'或'故障'的实际状态.但是,我无法将任务指定为长时间运行.那么,任何人都知道如何最好地运行异步任务,同时存储该活动任务本身(使用所需的taskStatus)并将任务设置为长时间运行?
我有一个.NET MVC Web应用程序,需要时间才能正常关闭,因此每当IIS应用程序域被回收时(即,新实例在新实例关闭时接收所有新请求,等待未完成的请求完成)我需要阻止此应用程序关闭,直到我的应用程序的当前异步后台工作(包含没有未完成的请求)已完成.IRegisteredObject(参见http://blog.stephencleary.com/2014/06/fire-and-forget-on-asp-net.html)提供了这种阻止功能,但是,我的进程似乎总是在与我的阻塞不一致的情况下死亡时间和IIS设置.
我看到这篇文章(IRegisteredObject没有按预期工作)解释了IIS关闭时间限制的重要性,但是,当IRegisteredObject似乎阻塞了一段时间后,我无法让循环阻止2小时所需的时间(也不是我可以通常得到基于各种设置有意义的结果).
下面是一个IRegisteredObject的简单实现,它带有我一直用于测试的后台线程:
public class MyRegisteredObject : IRegisteredObject
{
public void Register()
{
HostingEnvironment.RegisterObject(this);
Logger.Log("Object has been registered");
}
// the IRegisteredObject.Stop(...) function gets called on app domain recycle.
// first, it calls with immediate:false, indicating to shutdown work, then it
// calls 30s later with immediate:true, and this call 'should' block recycling
public void Stop(bool immediate)
{
Logger.Log("App domain stop has been called: "
+ (immediate ? "Immediate" : "Not Immediate") …Run Code Online (Sandbox Code Playgroud) 我一直在想关于SQL Server数据库触发器的并发语义.我有一个数据库触发器,在更新表后运行.触发器将"dateModified"列设置为当前时间.这使我始终知道表的最新更新发生在X时.下面是它的样子:
ALTER TRIGGER base.TR_myTrigger ON base.myTable
AFTER INSERT, UPDATE AS
BEGIN
DECLARE @dateModified AS DATETIMEOFFSET
SET @dateModified = SYSDATETIMEOFFSET()
UPDATE base.myTable
Set dateModified = @dateModified
WHERE id in (SELECT DISTINCT(id) FROM inserted)
END
Run Code Online (Sandbox Code Playgroud)
在我的场景中,表可以随时由任意数量的线程更新.这个触发器在多线程环境中是否安全?如果线程A更新了表,并且线程B在之后立即从中读取,那么B是否会看到具有A更新但没有触发更新的表的状态?或者触发器是否保护表不被读取,直到执行了所有操作+其触发器?
任何洞察使用SQL数据库触发器在幕后发生的事情都将受到赞赏.谢谢!
我有以下HTML来呈现带有图标的日期输入框:
@if (Model.ShowThis){
<input id="box1" type="hidden" value="@Model.SelectedDate.ToString("yyyy-MM-dd")" size="10" />
<span id="icon1" class="picture"></span>
}
Run Code Online (Sandbox Code Playgroud)

您会注意到图标向右移动.如果我将代码修改为:
@if (Model.ShowThis){
<input id="box1" type="hidden" value="@Model.SelectedDate.ToString("yyyy-MM-dd")" size="10" /><!--
--><span id="icon1" class="picture"></span>
}
Run Code Online (Sandbox Code Playgroud)

您会注意到由于删除了任何潜在的空白区域而不再发生移位.如果没有这些注释,我可以进入调试器并看到元素之间的额外间距,一旦删除,也可以解决问题.
为什么.cshtml文件中的标准新行(在Razor块内)导致这些HTML元素之间存在不间断的空格?我之前从未在同一类型的场景中的其他文件中看到此行为.
c# ×2
.net ×1
appdomain ×1
asp.net ×1
asp.net-mvc ×1
asynchronous ×1
concurrency ×1
css ×1
database ×1
html ×1
iis ×1
razor ×1
recycle ×1
sql-server ×1
task ×1
triggers ×1