使用来自非线程安全的外部供应商的DLL

本文关键字:外部 供应商 DLL 安全 线程 | 更新日期: 2023-09-27 18:04:22

我正在使用外部供应商的DLL形式。这个DLL不是线程安全的,如果我试图从不同的线程调用它的方法,它实际上会停止并出现错误消息框。我使用的DLL来自一个更大的框架,使用更多的线程访问DLL。两个线程不是同时活动的,没有竞争条件的风险。

问题是;克服这个问题的简单方法是什么?我开始制作一个包装器,运行在一个特殊的线程,永远不会中止使用ManualResetEvent, waitOne和事件。但是经历事件并不能达到目的。我如何使dll相信它只从一个线程使用?

使用来自非线程安全的外部供应商的DLL

我建议为您的dll编写一个包装器类。

如果你正在使用。net 4+,你可以看看专门的任务调度器。特别是这个:http://blogs.msdn.com/b/pfxteam/archive/2010/04/07/9990421.aspx

如果你不这样做,你可以在没有TPL的情况下应用相同的原则。那就多花点功夫了。

通过StaTaskScheduler上调度的任务来调用这个dll中的每个函数。

你的dll调用应该没问题;)

编辑:

我猜代码应该是这样的:

public class NotThreadSafeClass
{
    public int SomeMethod(string x, int y)
    {
        return 3;
    }
}
public class ThreadSafeWrapper
{
    private TaskScheduler sta = new StaTaskScheduler(numberOfThreads: 1);
    private NotThreadSafeClass old = new NotThreadSafeClass();
    public Task<int> SomeMethod(string x, int y)
    {
        return Task<int>.Factory.StartNew(() => old.SomeMethod(x,y),
             CancellationToken.None, TaskCreationOptions.None, sta);
    }
}

如果你在4+中,我会将等待保留在包装器外面。此外,类应该是单例的,以防止多次创建,最终导致多个线程访问它。