使用Interlocked.Increment编写整数并仅从其他线程读取整数时,我需要使用volatile吗?

时间:2018-09-14 15:14:26

标签: c# asp.net-core

我想实现一个ASP.NET Core中间件(仅存在一个单例实例),该中间件将维护一个整数请求计数器,该计数器在每次请求进入时都会增加,并在每次请求进入时都会减少。完成。

public class GracetermMiddleware
{
    private int requestCount = 0;

    ...

    public async Task Invoke(HttpContext httpContext)
    {
        Interlocked.Increment(ref requestCount);

        try
        {
            await next.Invoke(httpContext);
        }
        finally
        {
            Interlocked.Decrement(ref requestCount);
        }
    }
}

然后我想做的是让一个事件处理程序在应用程序停止时触发,以延迟进程的终止,直到处理了未解决的请求。这就是我试图达到的目的。

private void OnApplicationStopping()
{
    do
    {
        // Waiting for the outstanding requests to drain
        Thread.Sleep(1000);
    }
    while (requestCount > 0);
}

(我还有一些超时处理,示例中省略了。)

我的问题是:声明volatile字段时是否需要使用requestCount关键字?会导致该字段不是volatile的任何问题吗?

0 个答案:

没有答案