如何创建线程安全的 c# exe 包装器

Posted

技术标签:

【中文标题】如何创建线程安全的 c# exe 包装器【英文标题】:How to create a threadsafe c# exe wrapper 【发布时间】:2013-09-04 01:48:18 【问题描述】:

我正在尝试将 html 转换为 PDF。

我检查了 PDFSharp 和 ITextSharp,它们看起来都不太复杂,但是有一个可执行文件 wkhtmltopdf 似乎是迄今为止最好的评论。

我想将 wkhtmltopdf 控制台应用程序用作库。

我可以想象这种情况以不同的格式发生,但找不到足够具体的解决方案来使用。

有一个现有的 C# wkhtmltopdf 包装库,但在部署和应用程序挂起时存在问题。

只有一个调用我需要传递这个 .exe 文件,类似于:

wkhtmltopdf.exe "www.adsf.com" convertedPdfOfAsdf.pdf

我想创建一个衍生出一个线程的库:

    将 wkhtmltopdf.exe 的实例复制到临时位置 通过反射调用 wkhtmltopdf.exe 删除包含副本 wkhtmltopdf.exe 的临时位置

我以前没有尝试过这样的事情,所以不确定这是否是解决问题的最佳方法,但肯定有一个可重现的解决方案。

PS。我的解决方案必须是线程安全的。它将作为 Web 应用程序运行。

【问题讨论】:

为什么不把文件放在一个队列中,然后串行处理呢?您的网站可以使用唯一 ID 进行查询,以查看何时完成。我相信这将是一个更简单的解决方案。 嗯,这是个好主意 【参考方案1】:

听起来你正走向 DLL 地狱。虽然您提出的解决方案将提供实例之间的分离,但它会很快迫使您进入必须处理 Unable to cast X to X 异常的情况。

我建议锁定对底层库的访问,并强制您的应用程序等待,或者考虑在多个 AppDomain 中线性执行相同的代码。

【讨论】:

【参考方案2】:

对于一个站点,我使用ConcurrentQueue,这是一种线程安全的数据结构,以便在我的消费者弹出下一个要处理的事情时更简单地添加到队列中。

您可以在此处查看问题中的示例:

Lock Free Concurrent Queue

所以只需让上传返回一个唯一的 id 到 javascript

然后,javascript 会查询网络服务器以查看文件是否已处理,在此之前它将让用户知道状态(例如,前面可能有多少条记录)。

根据网站的制作方式和技术,这可能是一种更简单的方法。

【讨论】:

以上是关于如何创建线程安全的 c# exe 包装器的主要内容,如果未能解决你的问题,请参考以下文章

std::unordered_map 上的线程安全包装器

当我从 C# 代码调用 C++ 代码时,它是线程安全的吗?

Java -- 每日一问:如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?

Java -- 每日一问:如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?

C++ 无法理解为啥这段代码不是线程安全的

在 C# 中使用 Interlocked 获取和设置线程安全吗?