我正在使用一个非线程安全但不使用其他非线程安全外部资源的库。
使线程安全是一件很痛苦的事情(它不是线程安全的主要原因是它在每个实例的基础上使用了很多静态字段,它可以很好地处理许多实例顺序处理如果并行使用多个实例,购买显然会失败)
我正在考虑将以下内容作为快速解决方案,感觉很乱,并且我想知道这种方法是否存在任何内在错误。
为每个线程创建一个应用程序域,将线程数据编组到该域,在每个域中加载库并运行与我有线程一样多的应用程序域,然后在完成后卸载。
我明白这意味着减速(许多库加载和大量的编组和强制)但除此之外,我错过了一些显而易见的事情,这使得这不可能吗?
答案 0 :(得分:0)
您需要与多少图书馆进行互动?如果它不是太大,你可以围绕它构建一个包装器。您调用包装器的方法,它处理锁定并对内部库进行线程安全调用。
您可以声明一个接口,并且该实现是您的包装类。现在,除了解决线程安全问题之外,您还删除了对静态方法的不可测试的直接依赖。
这可能是一点点工作(如果它可行,取决于库),但它肯定比创建应用程序域只是为了保持静态成员的单独“实例”更清晰。
// Class with static memebers
public class FooManager
{
public static void ManageFoo(Foo foo)
{
// Does some non thread-safe stuff
}
}
public interface IFooManager
{
void ManageFoo(Foo foo);
}
public class FooManagerWrapper : IFooManager
{
private static readonly object FooManagerLock = new object();
public void ManageFoo(Foo foo)
{
lock (FooManagerLock)
{
FooManager.ManageFoo(foo);
}
}
}
This blog post包含另一个例子。即使线程安全不是问题,我也不希望我的代码直接依赖静态类和方法(即使我写了它们。)