小编Rya*_*yan的帖子

如何将LongRunning标志专门传递给Task.Run()?

我需要一种方法来设置异步任务,因为长时间运行而不使用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 c# asynchronous task

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

如何正确使用IRegisteredObject阻止应用程序域关闭/回收Web应用程序?

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

c# asp.net iis appdomain recycle

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

SQL数据库触发线程安全?

我一直在想关于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数据库触发器在幕后发生的事情都将受到赞赏.谢谢!

database sql-server concurrency multithreading triggers

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

为什么.NET Razor中的这些HTML元素会有新行引起的额外间距?

我有以下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元素之间存在不间断的空格?我之前从未在同一类型的场景中的其他文件中看到此行为.

html css asp.net-mvc razor

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