关于在文件加载期间使C#类持久化的问题

关于在文件加载期间使C#类持久化的问题,c#,C#,很抱歉,这是我目前能想到的最好的标题 基本上,我已经编写了一个将文件加载到数据库中的单例类。这些文件通常很大,处理起来需要几个小时。我要寻找的是创建一个方法,在这个方法中我可以运行这个类,并且能够从其中调用方法,即使它调用的类被关闭 singleton类很简单。它启动一个线程,将文件加载到数据库中,同时具有报告当前状态的方法。简言之,它有点像这样: public sealed class BulkFileLoader { static BulkFileLoader instance = nu

很抱歉,这是我目前能想到的最好的标题

基本上,我已经编写了一个将文件加载到数据库中的单例类。这些文件通常很大,处理起来需要几个小时。我要寻找的是创建一个方法,在这个方法中我可以运行这个类,并且能够从其中调用方法,即使它调用的类被关闭

singleton类很简单。它启动一个线程,将文件加载到数据库中,同时具有报告当前状态的方法。简言之,它有点像这样:

public sealed class BulkFileLoader {
  static BulkFileLoader instance = null;
  int currentCount = 0;

  BulkFileLoader()

  public static BulkFileLoader Instance
  {
    // Instanciate the instance class if necessary, and return it
  }

  public void Go() {
    // kick of 'ProcessFile' thread
  }


  public void GetCurrentCount() {
    return currentCount;
  }

  private void ProcessFile() {
    while (more rows in the import file) {
      // insert the row into the database
      currentCount++;
    }
  }
}
其思想是,您可以获得一个BulkFileLoader实例来执行,该实例将处理要加载的文件,而在任何时候,您都可以使用GetCurrentCount()方法获得到目前为止完成的行数的实时更新

这很好,只是调用类需要在整个过程中保持打开状态才能继续处理。一旦我停止调用类,BulkFileLoader实例就会被删除,并停止处理该文件。我所追求的是一个解决方案,它将继续独立运行,而不管调用类发生了什么

然后我尝试了另一种方法。我创建了一个简单的控制台应用程序,启动BulkFileLoader,然后将其包装为一个流程。这解决了一个问题,因为现在当我启动进程时,即使我关闭调用该进程的类,文件仍将继续加载。但是,现在的问题是无法获取当前计数的更新,因为如果我尝试获取BulkFileLoader的实例(如前所述,它是一个单例),它将创建一个新的实例,而不是返回当前正在执行的实例。单例似乎没有扩展到机器上运行的其他进程的范围

最后,我希望能够启动BulkFileLoader,并在任何时候都能够找出它处理了多少行。但是,即使我关闭了用于启动它的应用程序,也会出现这种情况

有人能看到我的问题的解决方案吗?

您可以创建一个将公开(比如)WCF端点的API。通过此API,您将能够查询服务的状态并添加更多文件以进行处理。

您应该将“批量上传器”设置为服务,并让其他进程通过IPC与之通信

你需要一项服务,因为你的上传需要几个小时。听起来您希望它在必要时无人值守地运行,并且希望它与调用线程分离。这就是服务做得好的地方

您需要某种形式的进程间通信,因为您希望在进程之间发送信息

有关与您的服务进行通信的信息,请参阅


然后,您可以随时向后台服务发送“作业开始”和“作业状态”命令和查询。

您说
,我一停止调用类,BulkFileLoader实例就被删除,它就停止处理文件。
-但是工作线程应该阻止这种情况。。。或者您的意思是呼叫进程本身正在退出?如果是这样,你将需要一个单独的服务。你所说的“关闭课堂”是什么意思。因为它是静态的,所以不可能是超出范围的问题。你是说进程在后台线程结束之前退出吗?BulkFileLoader是一个类库,因此需要由另一个进程启动。为此,我刚刚创建了一个控制台应用程序,其代码可以概括为:console.WriteLine(“start”);BulkFileLoader bfl=BulkFileLoader.Instance;bfl.Go();Console.WriteLine(“已启动”);Windows控制台弹出并打印“开始”,然后几乎立即打印“开始”。我进入SQL server,非常清楚记录正在被写入。但是,控制台将挂起,直到BulkFileLoader完成。如果我关闭控制台,记录将停止插入。非常感谢您的回复。这里的另一个开发人员似乎也认为这可能是最好的方法,但是我不太了解IPC,也不知道它将如何与服务接口。我尝试过谷歌搜索,但没有找到任何具体的答案。您知道这样一个任务的资源链接吗?谢谢,阿加尼刚刚加了一个。您应该构建一个服务,然后为IPC使用WCF的“NetNamedPipeBinding”。IPC只是所有操作系统/API使用的通用名称,.Net当前选择的IPC平台是WCF。这只是一个更新,经过大量的google开发,我现在使用WCF将其作为Windows服务使用,我相信这是一个非常可靠的解决方案。非常感谢两位提出这一建议的海报。你给我指明了正确的方向。当然,随时都可以!很高兴这有帮助。