我正在使用DLL作为外部供应商。此DLL不是线程安全的,如果我尝试从不同的线程调用其方法,它实际上会停止并显示错误消息框。我正在使用更大的框架中的DLL,这些框架使用更多线程访问dll。线程同时不活动,没有竞争条件的风险。
所以问题是;克服这个问题的简单方法是什么?我开始创建一个在一个特殊的线程中运行的包装器,它永远不会使用ManualResetEvent,waitOne和events中止。但是经历事件并不能解决问题。如何让dll相信它只在一个线程中使用?
答案 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岁以上,我会继续等待包装外的等待。 此外,该类应该是一个单例,以防止多个创建,最终导致多个线程访问它。