并行处理服务

时间:2015-03-17 14:13:04

标签: c# .net c#-4.0

我有从不同进程调用的方法,有时是同时进行的。在那个方法的某个地方,我想要计算折扣。为此,我创建了一个DiscountService,它从DB读取信息并计算给定客户编号的折扣。如上所述,可以从具有不同客户编号的不同位置同时调用主方法。

主要方法:

// this may be called simultaneously
public void Handle(IDocument document)
{
  // document contains customer number
  ...
  // update document discount property
  this._discountService.Process(document);
  // continue processing

DiscountService:

public class DiscountService : IDiscountService
{
    private readonly IDiscountDataAccess discountDataAccess;

    private readonly ILog logger;

    public DiscountService(ILog logger, IDiscountDataAccess discountDataAccess)
    {
        this.discountDataAccess = discountDataAccess;
        this.logger = logger;
    }

    public void Process(IDiscountDocument discountDocument)
    {
        this.ProcessDiscount(discountDocument);
        discountDocument.Update();
    }

    private void ProcessDiscount(IDiscountDocument discountDocument)
    {
        Discount discount = this.GetAvailableDiscount(discountDocument);
        ...
    }
    private Discount GetAvailableDiscount(IDiscountDocument discountDocument)
    {
        // Stored proc 
        return this.discountDataAccess.GetAvailableDiscount(
            discountDocument.CustomerNumber, 
            discountDocument.StartDate, 
            discountDocument.EndDate);
    }
    ...
}

我的问题是,我的DiscountService是否应该是线程安全的?如果是这样,我将如何处理这种情况。或者我是否需要某种类型的管理器,为每个主要的方法调用“new”DiscountService?或者这个足够吗?

感谢

编辑: 做这样的事情有没有模式。有一项服务可以同时运作吗?

是否有一本书,复杂的视频,谈论这样的东西的设计/模式?举例?

2 个答案:

答案 0 :(得分:3)

一般情况下,如果你从数据库中读取一些给定ID的东西,从你检索的数据中你可以计算出你需要的一切,那么你就不需要线程安全,因为你没有共享内存访问。

从您的帖子中不清楚的是,是否从多个线程访问了提供的discountDocument,或者它是否仅在请求处理过程中存在。

从我所看到的,我认为discountDocument需要是线程安全的(在对象内部,但这只是一个猜测,因为我不知道还有什么事情发生),但是服务很好。

答案 1 :(得分:1)

从您的代码中,您正在使用discountDataAccess进行依赖注入:

public DiscountService(ILog logger, IDiscountDataAccess discountDataAccess)
{
    this.discountDataAccess = discountDataAccess;
    this.logger = logger;
}

然后你会像这里一样使用这个注入的服务:

private Discount GetAvailableDiscount(IDiscountDocument discountDocument)
{
    // Stored proc 
    return this.discountDataAccess.GetAvailableDiscount(
        discountDocument.CustomerNumber, 
        discountDocument.StartDate, 
        discountDocument.EndDate);
}

所以对我来说,结论是discountDataAccess必须是线程安全的,或者至少是getavailablediscount。您要么创建或重用现有连接的机会非常高,如果没有保护机制就会遇到问题。

DiscountDocument通过请求进来,我假设每个请求都有一个不同的文档,因此在DiscountDocument中不太可能出现问题。

但是,如果discountDocument确实也是一个共享资源,那么它可能需要一些自己的锁定,然后问题变得越来越大,因为你冒着在这种情况下遇到死锁的风险。