WCF是长数据导入过程的正确选择吗?

时间:2012-04-17 15:09:20

标签: c# wcf windows-services

我正在为我们的业务创建一个流程,它从数据库中获取一些数据(A),对数据进行一些处理,然后将其复制到另一个数据库中的另一个表中(B)。我们正在处理的数据量很大,我们预计此过程需要很长时间(数周)。

使用WCF这种任务是否是明智的设计选择?这样我认为我可以使用某种客户端应用程序/ Web前端(业务的其余部分可以使用)来“查询”/显示整个导入过程的进度。我还想让客户能够通过服务启动/暂停/停止导入过程。

这可以在WCF中执行吗?这是否是正确的选择?我想在某些方面,这需要像常规Windows服务一样(我只是认为通过WCF通过某些方法“查询”导入的进度会更容易吗?)

另外,如果一个用户试图同时启动/停止导入过程等,我是否会遇到问题?单例模式是否适用于确保每个人都使用相同的单一导入过程?

非常感谢任何想法/想法。

2 个答案:

答案 0 :(得分:2)

编辑/前言:此答案假设您只想将WCF 用于与进程的用户交互,而不是用于整个软件堆栈的通信,并且核心工作已完成通过长期服务本身。

是的,这在WCF中是可行的,它可能是正确的解决方案。你将有一个长期运行的处理器线程,经常查询/更新一些互操作属性(例如,它将更新它完成的百分比,它正在处理的项目,并检查“暂停”标志等)。反过来,这些属性将由WCF接口方法查询/设置。

单例模式非常适用于此 - 如果正确设置了线程,则用户将与长期运行的线程(或多个线程)检查的某些属性进行交互。

从极高的角度来看,处理器类可能在核心看起来像这样(这只是一个如何完成它的模型;不要让它完全像这样或者我会做噩梦):

// IWcfProcessor is the ServiceContract interface
// Processor runs as a singleton and does (or has a thread that does) the processing work
class Processor : IWcfProcessor
{
    public Processor()
    {
        new Thread(Process).Start();
    }

    public void Process()
    {
        while (Run)
        {
            // Do long-running process stuff, update some tables
            PercentDone += 0.1;
        }
    }

    public decimal PercentDone { get; set; }
    public bool Run { get; set; }

    /// WCF method defined in IWcfProcessor
    public void SetState(bool state)
    {
        Run = state;
    }

    /// WCF method defined in IWcfProcessor
    public decimal GetStatus()
    {
        return PercentDone;
    }
}

然后,您可以从Web或应用程序端点挂接IWcfProcessor个接触点。

  

另外,如果一个用户试图同时启动/停止导入过程等,我是否会遇到问题?

假设您正确设置了线程互操作,则不会出现问题。

  

单身模式是否适用于确保每个人都在使用相同的单一导入流程?

是的,这很完美。

答案 1 :(得分:2)

是。这可以与WCF Streaming一起使用。在这里,请查看我的answer以了解其他类似问题。