在后台线程上运行长代码?

时间:2012-02-12 19:14:06

标签: c# wcf asynchronous

我的一位业务经理有以下方法:

    public ImportItemsResult Import(String fullPath)
    {
        OleDbDataManager oleDbDataManager = new OleDbDataManager();
        List<ItemInfo> importedData = oleDbDataManager.GetData<ItemInfo>(fullPath, ItemInfoMapper).ToList();
        ImportItemsResult result = ValidateImportedData(importedData);
        if (result.Status == OperationStatus.Success)
        {
            //do something with importedData in the background and return 
            //the result to the user right away
        }
        return result;
    }

该代码允许用户上传.csv文件,然后对其进行解析和验证。在验证之后,如果所有数据都是okey,则处理数据并将其保存到数据库,否则文件将被拒绝,并在UI上向用户显示详细的错误消息。

问题:

  • 是否可以安全地假设一旦验证结果成功,处理应该 - 理论上 - 由于所有数据都有效而正常?
  • 是否可以在后台线程上运行处理代码并立即从该方法返回?我可以在上面代码中的if语句中执行此操作,还是需要重新构造整个内容?

我之所以这么想是因为我需要通过WCF Web服务公开这个功能,我不知道它会处理可能导致Web服务的数据的时间有多长如果花了太长时间就超时了。有什么建议吗?

3 个答案:

答案 0 :(得分:0)

验证后仍然可能出现问题 - 您的WCF服务可能崩溃或者它所处的机器失去电源 - 您将丢失所有数据。

您需要在返回结果之前将CSV数据保存到非易失性介质 之前。此外,我将长时间运行的代码放入一个单独的Windows服务(假设您的WCF服务是IIS托管,否则您可以将两者结合起来),这只是处理。您可以使用WCF Web服务和Windows服务用于存储和检索CSV数据的数据库。

答案 1 :(得分:0)

你永远不应该信任参数或期望“所有事情都能正常运行”,你应该使用try / catch语句并实现一些事情来处理错误(在某处记录某些内容,将详细信息发送给客户服务,......)。 / p>

为了防止超时,您应该将WCF服务设置为支持异步操作。

顺便问一下,你的OleDbDataManager是IDisposable吗?如果是这样,你应该包含一个using关键字来防止内存泄漏。

答案 2 :(得分:0)

这里有几点需要考虑:

  • 唯一的安全&#39;要假设的是,所有可能出错的事情都会出错。您应该在写入数据库时​​使用事务。
  • 虽然可以将操作发布到线程池(即使在IIS上),但我不知道它会实现什么。您仍然需要向客户端发送响应。还有一些问题需要问:
    • 多长时间&#39;?客户等待是否可行?您可以将服务的发送超时增加到合理的数量。
    • 如果确实需要真正的异步操作,可以使用其他机制,例如双工通道或某种pub / sub。然后调用可以立即返回,客户端可以使用这些机制等待回复。但这会使设计变得更加复杂。
  • 您还可以选择将数据流入并处理它,而不是一个大块。阅读更多here。它可以节省一些时间,因为您可以尽快处理块(如果您需要整体验证数据集,这将无法工作。)