C# 防止类方法一次执行多次

C# 防止类方法一次执行多次,c#,asp.net-mvc,dependency-injection,singleton,C#,Asp.net Mvc,Dependency Injection,Singleton,我有一个asp.net mvc控制器,它在执行时调用服务类中的方法来打开文件并开始将记录导入数据库。我希望以某种方式限制此方法或类,以便无法创建另一个实例,并防止再次调用该方法,直到它运行完毕。我已经读过关于singleton模式的内容,但我不确定它是否可以实现,因为该类是通过依赖注入实例化的 依赖项注入由Autofac处理 服务类别: namespace Nop.Plugin.Misc.CAImport.Services { public class CAImportServi

我有一个asp.net mvc控制器,它在执行时调用服务类中的方法来打开文件并开始将记录导入数据库。我希望以某种方式限制此方法或类,以便无法创建另一个实例,并防止再次调用该方法,直到它运行完毕。我已经读过关于singleton模式的内容,但我不确定它是否可以实现,因为该类是通过依赖注入实例化的

依赖项注入由Autofac处理

服务类别:

namespace Nop.Plugin.Misc.CAImport.Services
{    
    public class CAImportService: ICAImportService
    {
        #region Fields
        private IProductService _productService;
        private ICategoryService _categoryService;
        private IManufacturerService _manufacturerService;

        #endregion

        #region Constructor
        public CAImportService(IProductService productService, 
            ICategoryService categoryService,
            IManufacturerService manufacturerService)
        {
            this._productService = productService;
            this._categoryService = categoryService;
            this._manufacturerService = manufacturerService;
        }
        #endregion

        #region Methods
        /// <summary>
        /// Import products from tab delimited file
        /// </summary>
        /// <param name="fileName">String</param>
        public virtual void ImportProducts(string fileName, bool deleteProducts)
        {
            //Do stuff to import products

        }

        #endregion
    }
}

下面的代码向您的服务中添加了一个锁,以防止其他线程并发执行附带的语句

public class CAImportService: ICAImportService
{

    // OTHER METHODS AND SECTIONS REMOVED FOR CLARITY

    // Define static object for the lock
    public static readonly object _lock = new object();

    /// <summary>
    /// Import products from tab delimited file
    /// </summary>
    /// <param name="fileName">String</param>
    public virtual void ImportProducts(string fileName, bool deleteProducts)
    {
        lock (_lock)
        {
            //Do stuff to import products
        }
    }
}
公共类CAImportService:ICAImportService
{
//为清晰起见,删除了其他方法和部分
//为锁定义静态对象
公共静态只读对象_lock=new object();
/// 
///从制表符分隔的文件导入产品
/// 
///串
公共虚拟void导入产品(字符串文件名,bool deleteProducts)
{
锁
{
//做一些进口产品的工作
}
}
}

拥有单例对象不会阻止该对象的实例方法同时运行多次。即使对象只有一个实例,不同的线程也可以同时调用该方法。您需要
lock
或类似的机制,而不是单例模式。或者,更可能的是,您的设计需要重新思考。谢谢!正是我需要的
public class CAImportService: ICAImportService
{

    // OTHER METHODS AND SECTIONS REMOVED FOR CLARITY

    // Define static object for the lock
    public static readonly object _lock = new object();

    /// <summary>
    /// Import products from tab delimited file
    /// </summary>
    /// <param name="fileName">String</param>
    public virtual void ImportProducts(string fileName, bool deleteProducts)
    {
        lock (_lock)
        {
            //Do stuff to import products
        }
    }
}