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

时间:2014-05-21 15:06:52

标签: c# multithreading dll

我正在使用DLL作为外部供应商。此DLL不是线程安全的,如果我尝试从不同的线程调用其方法,它实际上会停止并显示错误消息框。我正在使用更大的框架中的DLL,这些框架使用更多线程访问dll。线程同时不活动,没有竞争条件的风险。

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

1 个答案:

答案 0 :(得分:0)

我建议为你的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岁以上,我会继续等待包装外的等待。 此外,该类应该是一个单例,以防止多个创建,最终导致多个线程访问它。